无法弄清楚如何从发电机制作发电机
Can't figure out how to make a generator from a generator
我无法弄清楚如何在不使用 gen
工作流语法的情况下制作 fscheck 生成器,并假设必须有一个好的方法来做到这一点。我最终得到一个嵌套的 Gen<Gen<...
并想要一个扁平化的版本。使用 option
我会使用 Option.bind
来消除嵌套。对于 seq
,我会使用 SelectMany
。但是我在Gen
模块中没有看到那种方法。
// return a Gen<char list> as expected
// first makes a random number from 5 to 8
// and then creates a random list of characters that long
let randomListLengths =
gen {
let! len = Gen.choose(5,8)
let! item = Gen.elements ['a';'b';'c'] |> Gen.listOfLength len
return item
}
// return a Gen<Gen<char list>>
let anotherWayThatDoesNotWork =
Gen.choose(5, 8)
|> Gen.map (fun len -> Gen.elements['a';'b';'c'] |> Gen.listOfLength len)
您可以使用 >>=
运算符:
let randomListLengths =
Gen.choose(5,8)
>>= (fun len -> Gen.elements ['a';'b';'c'] |> Gen.listOfLength len)
我无法弄清楚如何在不使用 gen
工作流语法的情况下制作 fscheck 生成器,并假设必须有一个好的方法来做到这一点。我最终得到一个嵌套的 Gen<Gen<...
并想要一个扁平化的版本。使用 option
我会使用 Option.bind
来消除嵌套。对于 seq
,我会使用 SelectMany
。但是我在Gen
模块中没有看到那种方法。
// return a Gen<char list> as expected
// first makes a random number from 5 to 8
// and then creates a random list of characters that long
let randomListLengths =
gen {
let! len = Gen.choose(5,8)
let! item = Gen.elements ['a';'b';'c'] |> Gen.listOfLength len
return item
}
// return a Gen<Gen<char list>>
let anotherWayThatDoesNotWork =
Gen.choose(5, 8)
|> Gen.map (fun len -> Gen.elements['a';'b';'c'] |> Gen.listOfLength len)
您可以使用 >>=
运算符:
let randomListLengths =
Gen.choose(5,8)
>>= (fun len -> Gen.elements ['a';'b';'c'] |> Gen.listOfLength len)