无法弄清楚如何从发电机制作发电机

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)