F# FSCheck收缩器是';我没打电话

F# FSCheck收缩器是';我没打电话,f#,shrink,fscheck,F#,Shrink,Fscheck,我似乎无法让FSCheck收缩器工作。说我有这个 let arb_chars = Arb.fromGenShrink( Arb.generate<char[]>, fun cs -> seq { printfn "shrinking..." for i in 0..(cs.Length) do print

我似乎无法让FSCheck收缩器工作。说我有这个

    let arb_chars =
        Arb.fromGenShrink(
            Arb.generate<char[]>,
            fun cs -> seq {
                printfn "shrinking..."
                for i in 0..(cs.Length) do
                    printfn "  shrink %d" i
                    yield [| cs.[0] |]
            })

    let prop_len() = gen {
        //let! a = Arb.generate<char[]> // this doesn't work either...
        let! a = arb_chars.Generator
        let len = a.Length
        printfn "a.Length = %A" len
        return (len <> 5)
    }
    :
    Check.One(config, prop_len)

让arb\u chars=
阿伯·弗洛姆根斯林克(
生成,
趣味cs->seq{
printfn“收缩…”
对于0中的i…(cs.长度)do
打印fn“收缩%d”i
收益率[| cs[0]|]
})
让prop_len()=gen{
//让!a=Arb.generate//这也不起作用。。。
设!a=arb\u chars.Generator
设len=a.长度
printfn“a.Length=%a”len
返回(第5列)
}
:
检查1(配置、属性)
当我运行它时,我总是得到0个收缩。下面是一个典型的运行:

a.Length = 0
a.Length = 4
a.Length = 1
a.Length = 0
a.Length = 4
a.Length = 7
a.Length = 6
a.Length = 7
a.Length = 19
a.Length = 18
a.Length = 5
Falsifiable, after 11 tests (0 shrinks) (StdGen (19971972,296557937)):
Original:
<null>
a.Length=0
a、 长度=4
a、 长度=1
a、 长度=0
a、 长度=4
a、 长度=7
a、 长度=6
a、 长度=7
a、 长度=19
a、 长度=18
a、 长度=5
11次试验(0次收缩)后可伪造(StdGen(19971972296557937)):
原件:

使用
Prop.ForAll
定义属性并使用自定义生成器/收缩器。类似这样的内容(很抱歉从内存中键入,但应该是关闭的)

让prop_len=prop.ForAll(arb_chars)
(乐趣a->
设len=a.长度
printfn“a.Length=%a”len
返回(第5列)
)

如何使用
道具
?它看起来像布尔值的生成器,但命名表明它是您要测试的属性?在任何情况下,我猜想使用
gen{}
计算表达式创建新的生成器会使FsCheck无法使用
arb_chars
'shrinker,因为它根本不知道正在使用
arb\u chars
prop\u len
生成器可以有任何实现,并且不定义其属性的收缩器own@Honza我只是使用
Check.One(配置,属性)
。我已经更新了示例。这就是问题所在!顺便说一句:它是小写的
Prop.forAll