如何为快速检查生成简单类型的任意实例

时间:2013-05-08 12:03:23

标签: haskell quickcheck

我有一个简单的类型定义:

data Cell = Cell {
    x       :: Int,
    y       :: Int
  } deriving (Show)

我无法使用Cell作为quickcheck属性的输入,大概是因为quickcheck不知道如何生成Cell值。

我的理解是我需要让Cell成为Arbitrary类型类的实例。

我该怎么做,例如,如果我想用x和y的随机正值生成Cell?

2 个答案:

答案 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