Haskell 如何在快速检查中使用自定义列表
在我的代码中,我需要生成一个Haskell 如何在快速检查中使用自定义列表,haskell,Haskell,在我的代码中,我需要生成一个点的列表 我已经在任意类型类中实例化了自定义类型点。 到目前为止还不错 现在我需要生成一个列表:[Points] 但是QuickCheck生成的默认随机列表(使用listOfI-crease?)对我不起作用。 因为我需要点之间的一些特殊关系。我知道生成器组合器,例如suchAs,但它们太慢了(因为关系非常罕见) 我已经定义了一个定制的Gen[Point]来满足我的需要 randomBoard :: Gen [Point] randomBoard = ... 但是我不
点的列表
我已经在任意
类型类中实例化了自定义类型点
。
到目前为止还不错
现在我需要生成一个列表:[Points]
但是QuickCheck生成的默认随机列表(使用listOf
I-crease?)对我不起作用。
因为我需要点之间的一些特殊关系。我知道生成器组合器,例如suchAs
,但它们太慢了(因为关系非常罕见)
我已经定义了一个定制的Gen[Point]
来满足我的需要
randomBoard :: Gen [Point]
randomBoard = ...
但是我不知道如何让我的测试在属性测试中使用这个定制的Gen
,因为它默认为listOf
生成的列表。IIUC,问题是你的测试使用的是任意的实例,通过可测试的(任意a,显示a,可测试的属性)=>可测试的(a->prop
获取自定义生成器的常见模式是使用所需的任意实例抛出一些newtype
s。所以你可以定义如下
newtype Board = Board [Point]
instance Arbitrary Board where
...
那就行了。但我建议您完全绕过任意
,使用for all
编写属性
genBoard :: Gen [Point]
genBoard = ...
shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...
myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)