functional-programming - FsCheck 生成器能否创建不断增加的序列
问题描述
我正在使用 FsCheck 制作生成器来创建假数据库记录。根据所讨论的字段,它使用 chooseFromList 或整数、浮点数等的生成器。
但是,一个麻烦的字段是必须是顺序的主键字段。即在生成的第一条记录中放入 1,在生成的第二条记录中放入 2,依此类推。在我生成一组记录后,我将使用它们在我的测试软件中模拟一个数据库表。
我的 FORTRAN 大脑梦想的每一个解决方案似乎都是邪恶的、不纯的和程序化的。但我相信这是一个比我更聪明的 FsCheck 用户遇到的问题。这可能是函子或单子的用例......
解决方案
ident
我们可以使用增加内部计数器的函数生成序列号:
type Shirt = { Collar : float; Sleeve : float; id: int }
let collars = [ 14.0; 14.5; 15.0; 15.5; 16.0; 16.5; 17.0; 17.5; 18.0; ]
let sleeves = [ 30.5; 31.5; 32.5; 33.5; 34.5; 35.5; 36.5; 37.5; 38.5]
let ident =
let n = ref 0
fun () -> n := !n + 1; !n
let shirtGen = gen {
let! collar = Gen.elements collars
let! sleeve = Gen.elements sleeves
return { Collar = collar ; Sleeve = sleeve; id = ident() }
}
shirtGen
|> Gen.sample 0 10
|> List.rev
|> Seq.iter (printfn "%A")
我正在反转生成的列表,Gen.sample
因为它会生成一个倒排列表。这是生成的样本:
{Collar = 14.5; Sleeve = 35.5; id = 1;}
{Collar = 15.0; Sleeve = 31.5; id = 2;}
{Collar = 16.5; Sleeve = 32.5; id = 3;}
{Collar = 17.5; Sleeve = 35.5; id = 4;}
{Collar = 16.5; Sleeve = 37.5; id = 5;}
{Collar = 14.0; Sleeve = 35.5; id = 6;}
{Collar = 18.0; Sleeve = 30.5; id = 7;}
{Collar = 16.0; Sleeve = 38.5; id = 8;}
{Collar = 17.0; Sleeve = 34.5; id = 9;}
{Collar = 14.5; Sleeve = 36.5; id = 10;}
推荐阅读
- c# - 如何加密密码?(csharp/dotnet - 天蓝色 sql 数据库)
- javascript - react-native-table-component 使用状态来渲染表数据
- xcode - 哪个版本的 Xcode 支持 iOS 12.2?
- python - 将路径转换为列表
- database - 使用 Graphql 突变更新 Postgres 表中的列值
- javascript - 将值传递给父组件未定义
- react-native - 尝试从嵌套对象中检索键/值后,“TypeErroe:无法读取未定义的属性名称”
- python - 使用另一个容器连接 Cassandra 容器
- css - CSS - 选择一个包含子类的类
- prestashop - prestashop 1.7.5 将 product-discounts.tpl 显示为 mini-products/product.tpl