【问题标题】:QuickCheck: defining Arbitrary instance in terms of other ArbitrariesQuickCheck:根据其他 Arbitrary 定义 Arbitrary 实例
【发布时间】:2011-03-01 04:20:07
【问题描述】:

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

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

现在我想为C 定义一个Arbitrary 实例,以便使用AB 的现有生成器生成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]

是否需要为AB 显式生成固定数量的值,或者是否有更好的方法将现有Arbitraries 组合成一个新值?

【问题讨论】:

    标签: haskell quickcheck


    【解决方案1】:

    我会这样做:

    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
    

    【讨论】:

    • arbitrary = C &lt;$&gt; arbitrary &lt;*&gt; arbitrary -- 应用ftw!
    • 有道理,谢谢!我更喜欢应用解决方案,但遗憾的是它在 QuickCheck 1 中不起作用,因为当时 Gen 不是 Applicative 的实例。
    • sclv 打败了我。应用程序可以非常强大且富有表现力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多