Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 快速检查值是否相等_Haskell_Quickcheck - Fatal编程技术网

Haskell 快速检查值是否相等

Haskell 快速检查值是否相等,haskell,quickcheck,Haskell,Quickcheck,我有一个QuickCheck属性,如下所示: prop42 :: Foo -> Bool prop42 foo = fn1 foo == fn2 foo 如果此属性失败,它将打印出foo的内容。但是我很想知道fn1和fn2返回了什么。如果foo很大,那么手工生成这些信息是非常重要的。(即,坐在那里,手动键入打印到Windows控制台窗口的巨大楔形文本。) 测试框架通常有一个比较相等的东西,如果相等性不成立,则打印出两个值。但我似乎找不到这样一个用于快速检查的函数…请从中查看combina

我有一个QuickCheck属性,如下所示:

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