有没有办法从Gen <a> to Gen</a> <a list=""> while specifying a bound?</a>开始

时间:2015-01-20 18:55:35

标签: f# fscheck

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]))]

让我说我有类似上面的东西。我有一个返回类型为Gen&lt; BirthdayLibrary.Birthday&gt;的生日生成器。您可以选择指定月份。来自Gen&lt; a&gt;的最佳方式是什么?到Gen&lt; a list&gt;何时为列表中的项目指定一些约束?我可以想办法获得&lt; Gen&lt; a&gt; list&gt;,我认为它不适用于编写应包含&lt; list a&gt;的父对象。 (这是这个例子的基础)。我也可以想办法做Gen&lt; Gen&lt; a&gt; list&gt;,我有组合问题以及列表中的所有值都是相同的。我看过Gen.arrayOf,我无法想到如何使用数组中每个项目的值。

1 个答案:

答案 0 :(得分:2)

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;                                                  月= 4;}; {day = 28;                                                                月= 5;};       {day = 9;        月= 6;}; {day = 28;                      月= 7;}; {day = 15;                                    月= 8;}; {day = 6;                                                  月= 9;}; {day = 21;                                                                月= 10;};       {day = 12;        月= 11;}; {day = 27;                       月= 12;}]]