【问题标题】:Can't figure out how to make a generator from a generator无法弄清楚如何从发电机制造发电机
【发布时间】:2020-12-30 12:52:37
【问题描述】:

我无法弄清楚如何在不使用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)

【问题讨论】:

    标签: f# fscheck


    【解决方案1】:

    您可以使用&gt;&gt;= 运算符:

    let randomListLengths =
        Gen.choose(5,8)
        >>= (fun len -> Gen.elements ['a';'b';'c'] |> Gen.listOfLength len)
    

    【讨论】:

    • 非常感谢!为了可发现性,不应该有像 Option.bind 和 Result.bind 这样的 Gen.bind 吗?
    • 是的,也许。你是第一个要求它的人 :) 说绑定可能在过去几年中变得更加“知名”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多