一直在尝试编写自己的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做的几乎完全相同,而且似乎没有任何问题。我错过了什么?
答案 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)