有没有办法在指定边界时从 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;}]]