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

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

现在,我想为Arbitrary定义一个C实例,以便使用现有的CA生成器生成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组合为新值?

最佳答案

我会这样:

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

关于haskell - 快速检查:根据其他任意实例定义任意实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5134259/

10-11 17:45