私は単純な型の定義を持っています:
data Cell = Cell {
x :: Int,
y :: Int
} deriving (Show)
クイックチェックプロパティへの入力としてCell
を使用することはできません。おそらく、クイックチェックがセル値を生成する方法を知らないためです。
私の理解では、CellをArbitrary
型クラスのインスタンスにする必要があります。
たとえば、セルをxとyのランダムな正の値で生成したい場合、どうすればよいですか?
データ型にArbitrary
のインスタンスを作成するのは簡単です。 arbitrary
関数を実装する必要があります。これはGen Cell
を返すはずです。これを行う最も簡単な方法は、既存のArbitrary
インスタンスを利用することです。また、Gen
はモナドであるため、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 のさまざまなジェネレーターを参照してください。
TemplateHaskellと derive packageを使用して、同じことを行うArbitrary
インスタンスを生成できます。
import Data.DeriveTH
derive makeArbitrary ''Cell