如何在QuickCheck中使用自定义listOf

时间:2019-12-18 19:29:08

标签: haskell

在我的代码中,我需要生成一个Point的列表

我在Point类型类中实例化了自定义类型Arbitrary。 到目前为止一切顺利。

现在我需要生成一个列表:[Points]

但是QuickQuick(我相信使用listOf生成的默认随机列表对我不起作用。 因为我需要points之间的某些特殊关系。我知道发电机组合器,例如。 suchAs但是它们太慢了(因为关系非常罕见)

我已经定义了一个自定义的Gen [Point]以适合我的需求。

randomBoard :: Gen [Point]
randomBoard = ...

但是我不知道如何让我的测试在属性测试中使用此自定义Gen,因为它默认为listOf生成的列表。

1 个答案:

答案 0 :(得分:3)

IIUC,问题是您的测试通过Arbitrary instance for Testable使用(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)实例。

获取自定义生成器的常见模式是使用所需的newtype实例抛出一些Arbitrary。所以你要定义类似

newtype Board = Board [Point]

instance Arbitrary Board where
  ...

那行得通。但我建议您完全绕开Arbitrary,并用forAll and its variants编写属性。

genBoard :: Gen [Point]
genBoard = ...

shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...

myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)