39

私は単純な型定義を持っています:

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

Cellおそらくクイックチェックがセル値を生成する方法を知らないため、クイックチェックプロパティへの入力として使用できません。

私の理解では、Cell を型クラスのインスタンスにする必要がありますArbitrary

たとえば、x と y のランダムな正の値で Cell を生成したい場合、どうすればよいでしょうか?

4

2 に答える 2

49

データ型の のインスタンスを書くのArbitraryは簡単です。arbitraryを返す関数を実装するだけGen Cellです。これを行う最も簡単な方法は、既存のArbitraryインスタンスを利用Genし、それがモナドであることに注意することです。したがって、 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.ModifiersPositiveの修飾子も使用して、正の整数のみを生成するようにしています。

より複雑なジェネレーターを作成するには、Test.QuickCheck.Genのさまざまなジェネレーターを参照してください。

于 2013-05-08T12:13:36.053 に答える
16

ArbitraryTemplateHaskell を使用して同じことを行うインスタンスを生成し、パッケージを派生させることができます。

import Data.DeriveTH

derive makeArbitrary ''Cell
于 2013-05-09T03:26:46.830 に答える