F# 离散场笛卡尔积上的FsCheck发生器

F# 离散场笛卡尔积上的FsCheck发生器,f#,fscheck,F#,Fscheck,很抱歉在主题行中使用数学。我把它打开一点。我想创建一个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; 3

很抱歉在主题行中使用数学。我把它打开一点。我想创建一个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]
文档清楚地显示了如何为这些轴环和套筒尺寸创建单独的生成器。我希望能够将它们合并到衬衫记录生成器中


这是一个简化的例子。我的目标是在一些表中创建数据库记录的生成器,并将这些生成器组合起来。

我从来没有使用过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] }

我并没有使用过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")

我认为这会对你有用:

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")

奇怪的是,所有的例子都显示Gen.sample有两个参数,但除非我只提供一个参数,否则它会抱怨得很厉害。模的变化——这是可行的。奇怪的是,所有的例子都显示Gen.sample有两个参数,但除非我只提供一个参数,否则它会抱怨得很厉害。模的变化,这是有效的。