11

我正在使用 QuickCheck 1,我有以下数据类型:

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

现在我想定义一个Arbitrary实例,C以便C使用现有的生成器为A和生成值B。我最终这样做了:

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)

虽然 sclvliftM2从 Control.Monad 使用的想法可能更好:

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