[英]How to use custom listOf in QuickCheck
在我的代码中,我需要生成一个Point
列表
我在Arbitrary
类型类中实例化了自定义类型Point
。 到现在为止还挺好。
现在我需要生成一个列表: [Points]
但是listOf
生成的默认随机列表(使用listOf
我相信?)对我不起作用。 因为我需要points
之间的一些特殊关系。 我知道 Generator 组合器,例如。 suchAs
但是他们太慢了(因为非常罕见的关系)
我已经定义了一个定制的Gen [Point]
来满足我的需求。
randomBoard :: Gen [Point]
randomBoard = ...
但我不知道如何让我的测试在属性测试中使用这个自定义Gen
,因为它默认为listOf
生成的列表。
IIUC,问题是您的测试使用Arbitrary
实例,通过Testable
实例 for (Arbitrary a, Show a, Testable prop) => Testable (a -> prop)
。
获取自定义生成器的常见模式是使用所需的Arbitrary
实例抛出一些newtype
。 所以你会定义类似的东西
newtype Board = Board [Point]
instance Arbitrary Board where
...
那行得通。 但我建议完全绕过Arbitrary
并使用forAll
及其变体编写您的属性。
genBoard :: Gen [Point]
genBoard = ...
shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...
myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.