似乎quickCheck告诉我False不等于False?

时间:2011-06-13 00:04:06

标签: haskell

一直在尝试编写自己的Prelude,并编写QuickCheck属性。写作Prelude进展顺利,但在进行QuickCheck时我已经设法被提前阻止。以下是我拥有的2个文件的片段:

- MyLude.hs

module MyLude where

import Prelude (Bool(..))

(&&) :: Bool -> Bool -> Bool
(&&) True a = a
(&&) _ _ = False

- MyLudeTest.hs

module MyLudeTest where

import qualified MyLude as P

prop_test_and a b = a && b == a P.&& b

然后在ghci我跑:

:load MyLudeTest.hs
:m +Test.QuickCheck
quickCheck prop_test_and

并收到以下错误:

*** Failed! Falsifiable (after 1 test):
False
False

让我感到困惑的是,我已经实现了(||)并为它实现了一个quickcheck属性,它与prop_test_and做的几乎完全相同,而且似乎没有任何问题。我错过了什么?

2 个答案:

答案 0 :(得分:7)

这只是运营商的优先级。您的属性被解析为:

prop_test_and a b = a && (b == a) P.&& b

答案 1 :(得分:5)

优先!

Prelude Test.QuickCheck> (False && False) == myand False False
True
Prelude Test.QuickCheck> False && False == myand False False
False

你在运营商周围丢失了一些问题。请记住(&&)(==)(4)

更弱(3)