내 Prelude를 쓰고 QuickCheck 속성을 쓰려고했습니다. Prelude 작문은 잘 진행되고 있지만 QuickCheck를 할 때 일찍 막을 수있었습니다. 다음은이 개 파일의 조각은 내가 가진 :quickCheck에서 False가 False가 아니라고 말하고있는 것 같습니다.
- 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
나를 혼란스럽게 만드는 것은 prop_test_and와 거의 같은 일을하는 quickcheck 속성을 구현 (||)하고 구현했기 때문에 문제가없는 것 같습니다. 내가 뭘 놓치고 있니?
오, 소년, 내가 어리 석다고 생각하니? 예 중위 연산자 우선 순위! 이 오류 유형을 인식하는 방법에 대한 정보는 무엇입니까? – Daniel
@Daniel : 대부분의 경우 프로그램은 typecheck에 실패합니다. 그러나 모든 하위 표현식이 여기에있는 것과 동일한 유형 인 경우에는 적용되지 않습니다. – hammar
"또는"이 제대로 작동 한 이유를 알 수 있습니다 :'a || (a == b) P. || b "- 아마도"또는 "라고 썼을 것이므로, 본질적으로'a || b '가 항상 true 인 경우,'a'와'b'가 모두'False' 인 경우를 제외하고는'a == b'가 true입니다! –