QuickCheck:根据其他Arbitraries定义任意实例

我正在使用QuickCheck 1,我有以下数据类型:
data A = ...
instance Arbitrary A where ...
data B = ...
instance Arbitrary B where ...
data C = C A B
现在我想为
C
定义一个
Arbitrary
实例,以便使用现有的生成器为
A
B
生成
C
值。我最终这样做了:
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]
这是否需要为
A
和ѭ5显式生成固定数量的值,或者是否有更好的方法将现有的
Arbitraries
组合成新的?     
已邀请:

bab

我这样做:
instance Arbitrary C
  where arbitrary = do a <- arbitrary
                       b <- arbitrary
                       return (C a b)
虽然sclv使用Control.Monad中的
liftM2
的想法可能更好:
instance Arbitrary C
  where arbitrary = liftM2 C arbitrary arbitrary
    

要回复问题请先登录注册