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

Dan*_*iel 2 haskell

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

- MyLude.hs

module MyLude where

import Prelude (Bool(..))

(&&) :: Bool -> Bool -> Bool
(&&) True a = a
(&&) _ _ = False
Run Code Online (Sandbox Code Playgroud)

- MyLudeTest.hs

module MyLudeTest where

import qualified MyLude as P

prop_test_and a b = a && b == a P.&& b
Run Code Online (Sandbox Code Playgroud)

然后在ghci我运行:

:load MyLudeTest.hs
:m +Test.QuickCheck
quickCheck prop_test_and
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

*** Failed! Falsifiable (after 1 test):
False
False
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 7

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

prop_test_and a b = a && (b == a) P.&& b
Run Code Online (Sandbox Code Playgroud)


Don*_*art 5

优先!

Prelude Test.QuickCheck> (False && False) == myand False False
True
Prelude Test.QuickCheck> False && False == myand False False
False
Run Code Online (Sandbox Code Playgroud)

你错过了运营商周围的问题.记住(&&)绑定弱(3)比(==)(4)