Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何在复杂情况下利用收缩_F#_Fscheck - Fatal编程技术网

F# 如何在复杂情况下利用收缩

F# 如何在复杂情况下利用收缩,f#,fscheck,F#,Fscheck,我刚刚开始使用FsCheck。我需要生成一些测试数据,这里TestData表示测试的输入: type Interval = { Start : DateTime; End : DateTime } type Frob = { Interval : Interval; MustFrob : bool } type TestData = { Intervals: Interval[]; Frob : Frob option } 我的生成代码如下所示: let generator = gen {

我刚刚开始使用FsCheck。我需要生成一些测试数据,这里
TestData
表示测试的输入:

type Interval = { Start : DateTime; End : DateTime }
type Frob = { Interval : Interval; MustFrob : bool }

type TestData = { Intervals: Interval[]; Frob : Frob option }
我的生成代码如下所示:

let generator = gen {
    let! startTime = Arb.Default.DateTime().Generator
    return! Gen.sized(fun size -> gen {
         let intervalDurations = Gen.listOfLength size myOwnSuperDurationGenerator
         let intervals = 
              // blabla using startTime and intervalDurations

         let! maybeFrob = Arb.Default.Option<Frob>().Generator
         let adjustedFrob = maybeFrob |> Option.map(fun f ->
              { f with Interval = // mess with the interval }
         return { Intervals = intervals; Frob = adjustedFrob }         
    }
}
let生成器=gen{
让!startTime=Arb.Default.DateTime().Generator
返回!Gen.size(有趣的大小->Gen{
让intervalDurations=Gen.listOfLength大小myOwnSuperDurationGenerator
让间隔=
//blabla使用开始时间和间隔时间
让!maybeFrob=Arb.Default.Option().Generator
让adjustedFrob=maybeFrob |>Option.map(乐趣f->
{f with Interval=//mess with the Interval}
返回{间隔=间隔;Frob=调整Frob}
}
}

这是可行的,但我不喜欢调用
Arb.Default.Blabla().Generator
,因为我无法向他们传递大小参数,所以我的测试不会利用收缩的优势。例如,将
Frob选项
收缩为
None
,或者选择一个更简单的
开始时间
。在生成这样的单个值时,是否有方法传播该大小参数?-也感谢pointi为了找出任何令人震惊的初学者错误,我真的只是想弄清楚如何使用这个API。

我不认为有一种简单的方法可以从复杂的生成器中获得收缩器,但是你可以从现有的收缩器中构建自己的收缩器。这个问题似乎让人想起GitHub上最近的一个问题:如果你能提供一个,我很乐意提出建议gest是具体的代码,但操作代码不能编译。