FsCheck 生成器在离散域的笛卡尔积上
FsCheck generator over the Cartesian product of discrete fields
抱歉在主题行中诉诸数学。我会把它拆开一点。我想创建一个 FsCheck 记录生成器,其中每个字段都限制为离散值。例如,衬衫尺码可以表示为衣领和袖长。
type Shirt = { Collar : float; Sleeve : float; }
但是长度有一组离散的尺寸。
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]
文档清楚地展示了如何为这些衣领和袖子尺寸创建单独的生成器。我希望能够将它们组合成 Shirt 记录生成器。
这是一个简化的例子。我的目标是在少数表中创建数据库记录生成器并将这些生成器组合起来。
并不是说我曾经使用过 FsCheck,但是根据您的定义,最简单的方法可能是通过列表序列表达式。
let collarSleeves =
[ for collar in collars do
for sleeve in sleeves ->
{ Collar = collar; Sleeve = sleeve } ]
let chooseFromCollarSleeves = gen {
let! i = Gen.choose (0, List.length collarSleeves - 1)
return collarSleeves.[i] }
我认为这对你有用:
open FsCheck
type Shirt = { Collar : float; Sleeve : float; }
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 shirtGen = gen {
let! collar = Gen.elements collars
let! sleeve = Gen.elements sleeves
return { Collar = collar ; Sleeve = sleeve}
}
shirtGen
|> Gen.sample 0 10
|> Seq.iter (printfn "%A")
抱歉在主题行中诉诸数学。我会把它拆开一点。我想创建一个 FsCheck 记录生成器,其中每个字段都限制为离散值。例如,衬衫尺码可以表示为衣领和袖长。
type Shirt = { Collar : float; Sleeve : float; }
但是长度有一组离散的尺寸。
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]
文档清楚地展示了如何为这些衣领和袖子尺寸创建单独的生成器。我希望能够将它们组合成 Shirt 记录生成器。
这是一个简化的例子。我的目标是在少数表中创建数据库记录生成器并将这些生成器组合起来。
并不是说我曾经使用过 FsCheck,但是根据您的定义,最简单的方法可能是通过列表序列表达式。
let collarSleeves =
[ for collar in collars do
for sleeve in sleeves ->
{ Collar = collar; Sleeve = sleeve } ]
let chooseFromCollarSleeves = gen {
let! i = Gen.choose (0, List.length collarSleeves - 1)
return collarSleeves.[i] }
我认为这对你有用:
open FsCheck
type Shirt = { Collar : float; Sleeve : float; }
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 shirtGen = gen {
let! collar = Gen.elements collars
let! sleeve = Gen.elements sleeves
return { Collar = collar ; Sleeve = sleeve}
}
shirtGen
|> Gen.sample 0 10
|> Seq.iter (printfn "%A")