module BirthdayLibrary =
type Birthday =
{ day :int
month :int }
module DataGen =
let birthdayGenerator (months:option<list<int>>) =
let monthGen = match months with
| Some m -> Gen.elements m
| None -> FsCheck.Gen.choose(1,12)
(fun m d -> { day = d
month = m}:BirthdayLibrary.Birthday)
<!> monthGen
<*> FsCheck.Gen.choose(1,28)
//I want this to have the signature Gen<BirthdayLibrary.Birthday list>
let oneForEveryMonthGen =
[ for m in [1 .. 12] ->
(fun mo -> birthdayGenerator (Some [mo]))]
让我说我有类似上面的东西。我有一个返回类型为Gen&lt; BirthdayLibrary.Birthday&gt;的生日生成器。您可以选择指定月份。来自Gen&lt; a&gt;的最佳方式是什么?到Gen&lt; a list&gt;何时为列表中的项目指定一些约束?我可以想办法获得&lt; Gen&lt; a&gt; list&gt;,我认为它不适用于编写应包含&lt; list a&gt;的父对象。 (这是这个例子的基础)。我也可以想办法做Gen&lt; Gen&lt; a&gt; list&gt;,我有组合问题以及列表中的所有值都是相同的。我看过Gen.arrayOf,我无法想到如何使用数组中每个项目的值。
答案 0 :(得分:2)
module BirthdayLibrary =
type Birthday =
{ day :int
month :int }
module DataGen =
let birthdayGenerator (months:option<list<int>>) =
let monthGen = match months with
| Some m -> Gen.elements m
| None -> FsCheck.Gen.choose(1,12)
(fun m d -> { day = d
month = m}:BirthdayLibrary.Birthday)
<!> monthGen
<*> FsCheck.Gen.choose(1,28)
//I want this to have the signature Gen<BirthdayLibrary.Birthday list>
let oneForEveryMonthGen =
[ for m in [1 .. 12] -> birthdayGenerator (Some [m])]
|> Gen.sequence
let sample = DataGen.oneForEveryMonthGen |> Gen.sample 10 1
给了我:
val sample:BirthdayLibrary.Birthday list list = [[{day = 7; month = 1;}; {day = 15; month = 2;}; {day = 13; month = 3;}; {day = 14; 月= 4;}; {day = 28; 月= 5;}; {day = 9; 月= 6;}; {day = 28; 月= 7;}; {day = 15; 月= 8;}; {day = 6; 月= 9;}; {day = 21; 月= 10;}; {day = 12; 月= 11;}; {day = 27; 月= 12;}]]