2011-06-13 2 views
2

내 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 속성을 구현 (||)하고 구현했기 때문에 문제가없는 것 같습니다. 내가 뭘 놓치고 있니?

답변

7

이것은 회사의 운영자 우선 순위입니다. 귀하의 속성은 다음과 같이 구문 분석됩니다 :

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

오, 소년, 내가 어리 석다고 생각하니? 예 중위 연산자 우선 순위! 이 오류 유형을 인식하는 방법에 대한 정보는 무엇입니까? – Daniel

+0

@Daniel : 대부분의 경우 프로그램은 typecheck에 실패합니다. 그러나 모든 하위 표현식이 여기에있는 것과 동일한 유형 인 경우에는 적용되지 않습니다. – hammar

+0

"또는"이 제대로 작동 한 이유를 알 수 있습니다 :'a || (a == b) P. || b "- 아마도"또는 "라고 썼을 것이므로, 본질적으로'a || b '가 항상 true 인 경우,'a'와'b'가 모두'False' 인 경우를 제외하고는'a == b'가 true입니다! –

5

우선 순위!

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

운영자 주변에 괄호가 없습니다. 기억하십시오 (&&) 약하게 (3)보다 (==) (4)

관련 문제