繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM