【发布时间】:2018-04-05 02:37:03
【问题描述】:
我正在浏览Haskell Book,关于应用程序的章节开始使用checkers 库进行测试。
这个库引入了EqProp 类型类,我不明白它与Eq 有何不同。无论如何,大多数需要EqProp 的示例都在后台使用Eq。
为什么人们使用检查器而不是 QuickCheck?
【问题讨论】:
标签: haskell quickcheck
我正在浏览Haskell Book,关于应用程序的章节开始使用checkers 库进行测试。
这个库引入了EqProp 类型类,我不明白它与Eq 有何不同。无论如何,大多数需要EqProp 的示例都在后台使用Eq。
为什么人们使用检查器而不是 QuickCheck?
【问题讨论】:
标签: haskell quickcheck
这个库引入了
EqProp类型类,我不明白这与Eq有何不同。
(==) from Eq 给你一个Bool;来自EqProp 的(=-=) 为您提供快速检查Property。如果您有Eq 的实例,您也可以将其设为EqProp 实例as witnessed by eq。 EqProp 的有趣实例是那些不是 Eq 实例的实例,例如函数(参见Li-yao Xia's answer)。
为什么人们使用检查器而不是 Quickcheck?
Checkers 是一套基于 QuickCheck 的额外工具。正如其readme 和Hackage 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)
【讨论】:
关键是函数和无限值不具有可判定相等性 (Eq),但可以通过观察(随机)有限片段。
【讨论】: