【问题标题】:Checkers and EqProp跳棋和 EqProp
【发布时间】:2018-04-05 02:37:03
【问题描述】:

我正在浏览Haskell Book,关于应用程序的章节开始使用checkers 库进行测试。

这个库引入了EqProp 类型类,我不明白它与Eq 有何不同。无论如何,大多数需要EqProp 的示例都在后台使用Eq

为什么人们使用检查器而不是 QuickCheck?

【问题讨论】:

    标签: haskell quickcheck


    【解决方案1】:

    这个库引入了EqProp 类型类,我不明白这与Eq 有何不同。

    (==) from Eq 给你一个Bool;来自EqProp(=-=) 为您提供快速检查Property。如果您有Eq 的实例,您也可以将其设为EqProp 实例as witnessed by eqEqProp 的有趣实例是那些不是 Eq 实例的实例,例如函数(参见Li-yao Xia's answer)。

    为什么人们使用检查器而不是 Quickcheck?

    Checkers 是一套基于 QuickCheck 的额外工具。正如其readmeHackage description 所建议的那样,它的目标之一是使将类法表达为Quickcheck 属性变得容易。例如,请注意the applicative "test batch" 的定义(我将在下面引用)看起来很像我们通常编写的Applicative 法律,并且很好地自我记录。

    (请随意跳过顶级签名中的簿记约束。另请注意,m (a,b,c) 参数以一种最简单的可能可行的方式,仅用于类型专业化,意图是您通过例如undefined :: [(Int,Int,Int)] 来测试Applicative 的列表实例。)

    -- | Properties to check that the 'Applicative' @m@ satisfies the applicative
    -- properties
    applicative :: forall m a b c.
                   ( Applicative m
                   , Arbitrary a, CoArbitrary a, Arbitrary b, Arbitrary (m a)
                   , Arbitrary (m (b -> c)), Show (m (b -> c))
                   , Arbitrary (m (a -> b)), Show (m (a -> b))
                   , Show a, Show (m a)
                   , EqProp (m a), EqProp (m b), EqProp (m c)
                   ) =>
                   m (a,b,c) -> TestBatch
    applicative = const ( "applicative"
                        , [ ("identity"    , property identityP)
                          , ("composition" , property compositionP)
                          , ("homomorphism", property homomorphismP)
                          , ("interchange" , property interchangeP)
                          , ("functor"     , property functorP)
                          ]
                        )
     where
       identityP     :: m a -> Property
       compositionP  :: m (b -> c) -> m (a -> b) -> m a -> Property
       homomorphismP :: (a -> b) -> a -> Property
       interchangeP  :: m (a -> b) -> a -> Property
       functorP      :: (a -> b) -> m a -> Property
    
       identityP v        = (pure id <*> v) =-= v
       compositionP u v w = (pure (.) <*> u <*> v <*> w) =-= (u <*> (v <*> w))
       homomorphismP f x  = (pure f <*> pure x) =-= (pure (f x) :: m b)
       interchangeP u y   = (u <*> pure y) =-= (pure ($ y) <*> u)
       functorP f x       = (fmap f x) =-= (pure f <*> x)
    

    【讨论】:

    • 所以看起来 QuickCheck 没有进行随机抽样的能力。谢谢你的回答,很有帮助!
    • @tesserakt QuickCheck 可以进行随机抽样——事实上,这是其背后的关键思想之一。当您使用 Checkers 时,您正在使用 QuickCheck 及其随机抽样; Checkers 只是增加了一层额外的便利功能。
    【解决方案2】:

    关键是函数和无限值不具有可判定相等性 (Eq),但可以通过观察(随机)有限片段。

    【讨论】:

    • 对,因此您对函数和随机输入值进行采样并认为这已经足够好了。那么 Eq 是“可判定的”,而 EqProp 是“足够接近的”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多