[英]How to generate arbitrary instances of a simple type for quickcheck
我有一个简单的类型定义:
data Cell = Cell {
x :: Int,
y :: Int
} deriving (Show)
我不能使用Cell
作为quickcheck属性的输入,大概是因为quickcheck不知道如何生成Cell值。
我的理解是我需要让Cell成为Arbitrary
类型类的实例。
我该怎么做,例如,如果我想用x和y的随机正值生成Cell?
为您的数据类型编写Arbitrary
实例很容易。 您只需实现arbitrary
函数,该函数应返回Gen Cell
。 最简单的方法是使用现有的Arbitrary
实例,并注意Gen
是一个monad,所以我们可以使用do
-notation:
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中的各种生成器。
您可以使用TemplateHaskell和派生包生成一个使用相同实例的Arbitrary
实例:
import Data.DeriveTH
derive makeArbitrary ''Cell
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.