首页 > 解决方案 > 如何在 QuickCheck 中使用自定义 listOf

问题描述

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

我已经PointArbitrary类型类中实例化了自定义类型。到现在为止还挺好。

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

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

我已经定义了一个Gen [Point]适合我需要的定制。

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

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

标签: haskell

解决方案


IIUC,问题是您的测试正在使用Arbitrary实例,Testable 例如 (Arbitrary a, Show a, Testable prop) => Testable (a -> prop).

获得自定义生成器的一种常见模式是newtype使用所需的Arbitrary实例抛出一些 s。所以你会定义类似的东西

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 -> ...)

推荐阅读