有没有办法在指定边界时从 Gen<a> 转到 Gen<a list>?
Is there a way to go from Gen<a> to Gen<a list> while specifying a bound?
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]))]
假设我有类似上面的东西。我有一个 return 类型的生日生成器。您可以选择指定月份。从 Gen 到 Gen 的最佳方法是什么,同时为列表的 gen 中的项目指定一些约束?我可以想出获取 list> 的方法,我认为这不适用于构成应包含 的父对象(这是本示例的基础)。我还可以想出一种方法来执行 Gen list>,我遇到了组合问题,而且列表中的所有值都相同。我看到 Gen.arrayOf 位我想不出如何让它与数组中每个项目的值一起工作。
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;
month = 4;}; {day = 28;
month = 5;};
{day = 9;
month = 6;}; {day = 28;
month = 7;}; {day = 15;
month = 8;}; {day = 6;
month = 9;}; {day = 21;
month = 10;};
{day = 12;
month = 11;}; {day = 27;
month = 12;}]]
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]))]
假设我有类似上面的东西。我有一个 return 类型的生日生成器 的父对象(这是本示例的基础)。我还可以想出一种方法来执行 Gen
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; month = 4;}; {day = 28; month = 5;}; {day = 9; month = 6;}; {day = 28; month = 7;}; {day = 15; month = 8;}; {day = 6; month = 9;}; {day = 21; month = 10;}; {day = 12; month = 11;}; {day = 27; month = 12;}]]