F# 从Gen<;a>;到Gen<;列表>;在指定边界时? 模块生日库= 打字生日= {日期:int 月份:int} 模块DataGen= 让生日生成器(月份:选项)= 让monthGen=与月份匹配 |一些m->Gen.m元素 |无->FsCheck.Gen.choose(1,12) (乐趣m d->{day=d month=m}:BirthdayLibrary.Birthday) 蒙森 FsCheck.Gen.choose(1,28) //我要这个有签名 让一个永远的蒙特根= [对于[1..12]中的m]-> (有趣的任务->生日生成器(一些[任务])]
假设我有类似上面的东西。我有一个返回类型为Gen的生日生成器。您可以选择指定月份。在为列表的Gen中的项指定某些约束时,从一个Gen转到另一个Gen的最佳方式是什么?我可以想出一些获取的方法,但我认为这对于构建一个应该包含a的父对象(这是本例的基础)是行不通的。我还可以想出一种方法来做Gen,我遇到了组合问题,列表中的所有值都是相同的。我看到Gen.arrayOf位,我想不出如何让它与数组中每个项目的值一起工作。F# 从Gen<;a>;到Gen<;列表>;在指定边界时? 模块生日库= 打字生日= {日期:int 月份:int} 模块DataGen= 让生日生成器(月份:选项)= 让monthGen=与月份匹配 |一些m->Gen.m元素 |无->FsCheck.Gen.choose(1,12) (乐趣m d->{day=d month=m}:BirthdayLibrary.Birthday) 蒙森 FsCheck.Gen.choose(1,28) //我要这个有签名 让一个永远的蒙特根= [对于[1..12]中的m]-> (有趣的任务->生日生成器(一些[任务])],f#,fscheck,F#,Fscheck,假设我有类似上面的东西。我有一个返回类型为Gen的生日生成器。您可以选择指定月份。在为列表的Gen中的项指定某些约束时,从一个Gen转到另一个Gen的最佳方式是什么?我可以想出一些获取的方法,但我认为这对于构建一个应该包含a的父对象(这是本例的基础)是行不通的。我还可以想出一种方法来做Gen,我遇到了组合问题,列表中的所有值都是相同的。我看到Gen.arrayOf位,我想不出如何让它与数组中每个项目的值一起工作。模块BirthdayLibrary= module BirthdayLibrary
模块BirthdayLibrary=
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]))]
打字生日=
{日期:int
月份:int}
模块DataGen=
让生日生成器(月份:选项)=
让monthGen=与月份匹配
|一些m->Gen.m元素
|无->FsCheck.Gen.choose(1,12)
(乐趣m d->{day=d
month=m}:BirthdayLibrary.Birthday)
蒙森
FsCheck.Gen.choose(1,28)
//我要这个有签名
让一个永远的蒙特根=
[对于[1..12]中的m]->生日生成器(一些[m])]
|>基因序列
设sample=DataGen.oneForEveryMonthGen |>Gen.sample 10 1
给我:
val示例:BirthdayLibrary.birthdaylist=[{day=7;
月=1;};{日=15;
月=2;};{日=13;
月=3;};{日=14;
月=4;};{日=28;
月=5;};
{天=9天;
月=6;};{日=28;
月=7;};{日=15;
月=8;};{日=6;
月=9;};{日=21;
月=10;};
{天=12天;
月=11;};{日=27;
月份=12;}]]
我将添加一个答案,为您提供您想要的签名以及约束,但我必须承认,我不完全理解您对组合问题的理解。所谓组合问题,我的意思是我无法打开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