Haskell 快速检查值是否相等
我有一个QuickCheck属性,如下所示:Haskell 快速检查值是否相等,haskell,quickcheck,Haskell,Quickcheck,我有一个QuickCheck属性,如下所示: prop42 :: Foo -> Bool prop42 foo = fn1 foo == fn2 foo 如果此属性失败,它将打印出foo的内容。但是我很想知道fn1和fn2返回了什么。如果foo很大,那么手工生成这些信息是非常重要的。(即,坐在那里,手动键入打印到Windows控制台窗口的巨大楔形文本。) 测试框架通常有一个比较相等的东西,如果相等性不成立,则打印出两个值。但我似乎找不到这样一个用于快速检查的函数…请从中查看combina
prop42 :: Foo -> Bool
prop42 foo = fn1 foo == fn2 foo
如果此属性失败,它将打印出foo
的内容。但是我很想知道fn1
和fn2
返回了什么。如果foo
很大,那么手工生成这些信息是非常重要的。(即,坐在那里,手动键入打印到Windows控制台窗口的巨大楔形文本。)
测试框架通常有一个比较相等的东西,如果相等性不成立,则打印出两个值。但我似乎找不到这样一个用于快速检查的函数…请从中查看combinators。例如,
printTestCase
允许向失败案例的输出中添加任意字符串。一个简单的例子:
prop x=let f=sin x
在printTestCase中(“应至少为”++显示f)$x>=sinx
$>快速检查道具
***失败了!可伪造(经过2次测试和1次收缩后):
-1.0
应至少为-0.8414709848078965
假设
fn1
和gn2
返回Bar
,我认为可以执行以下操作:
newtype Bar1 = B1 Bar deriving Show
newtype Bar2 = B2 Bar deriving Show
instance Arbitrary Bar1 where
arbitrary = arbitrary >>= return . B1 . fn1
instance Arbitrary Bar2 where
arbitrary = arbitrary >>= return . B2 . fn2
prop_xx = forAll arbitrary $ \(B1 b1) ->
forAll arbitrary $ \(B2 b2) ->
b1 == b2
根据尤里的回答,我的回答如下:
(?==?) :: (Eq x, Show x) => x -> x -> Property
x ?==? y =
printTestCase ("Left: " ++ show x) $
printTestCase ("Right: " ++ show y) $
x == y
现在我可以写这样的东西了
prop42 :: Foo -> Prop
prop42 foo = fn1 foo ?==? fn2 foo
哇!巧妙的。幸运的是,这不是必需的。@kosmikus感谢您的编辑。我想我们也可以只写
prop_xx(b1b1)(b2b2)=B1==B2
,但当时还不确定。这是可行的,但不推荐使用。相反,使用==
可能就足够了;信息技术
prop42 :: Foo -> Prop
prop42 foo = fn1 foo ?==? fn2 foo