Генератор FsCheck над декартовым произведением дискретных полей - PullRequest
0 голосов
/ 23 октября 2018

Извините, что прибегаю к математике в теме письма.Я его немного распакую.Я хочу создать генератор записей 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.

Это упрощенный пример.Моя цель - создать генераторы записей базы данных в нескольких таблицах и объединить эти генераторы.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я думаю, что это будет работать для вас:

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")
0 голосов
/ 23 октября 2018

Не то чтобы я когда-либо использовал 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] }
...