11

QuickCheck 1を使用していますが、次のデータ型があります。

data A = ...
instance Arbitrary A where ...
data B = ...
instance Arbitrary B where ...
data C = C A B

Arbitraryここで、のインスタンスを定義して、およびの既存のジェネレーターを使用しCC値が生成されるようにします。私はこれをすることになった:AB

instance Arbitrary C where
  arbitrary = elements [(C a b) |
                        a <- generate 20 (System.Random.mkStdGen 0) arbitrary,
                        b <- generate 20 (System.Random.mkStdGen 0) arbitrary]

これは、固定数の値を明示的に生成するためAB必要ですか、それとも既存のものArbitrariesを新しいものに結合するためのより良い方法がありますか?

4

1 に答える 1

20

私はこのようにします:

instance Arbitrary C
  where arbitrary = do a <- arbitrary
                       b <- arbitrary
                       return (C a b)

Control.Monadから使用するというsclvのアイデアliftM2はおそらく優れていますが、次のようになります。

instance Arbitrary C
  where arbitrary = liftM2 C arbitrary arbitrary
于 2011-02-27T17:21:10.467 に答える