我有一个简单的类型定义:
data Cell = Cell {
x :: Int,
y :: Int
} deriving (Show)
我无法使用Cell
作为quickcheck属性的输入,大概是因为quickcheck不知道如何生成Cell值。
我的理解是我需要让Cell成为Arbitrary
类型类的实例。
我该怎么做,例如,如果我想用x和y的随机正值生成Cell?
答案 0 :(得分:49)
为您的数据类型编写Arbitrary
的实例很简单。您只需实现arbitrary
函数,该函数应返回Gen Cell
。最简单的方法是使用现有的Arbitrary
个实例,并注意Gen
是一个monad,因此我们可以使用do
- 符号:
instance Arbitrary Cell where
arbitrary = do
Positive x <- arbitrary
Positive y <- arbitrary
return $ Cell x y
或者,通常可以使用Control.Applicative
:
instance Arbitrary Cell where
arbitrary = Cell <$> pos <*> pos
where pos = getPositive <$> arbitrary -- getPositive requires QC >= 2.5
在这里,我还使用了Test.QuickCheck.Modifiers中的Positive
修饰符来确保我们只生成正整数。
要编写更复杂的生成器,请查看Test.QuickCheck.Gen中的各种生成器。
答案 1 :(得分:17)
您可以使用TemplateHaskell和derive包生成Arbitrary
实例:
import Data.DeriveTH
derive makeArbitrary ''Cell