2012-10-24 4 views
3

신나는 질문, 왜 이것이 하스켈에서 올바르지 않습니까? 그래서 않을 것이다 ("> (Z) - -> Y, X ') - ("> Y X ")를, 그러나 isEqual는"바이너리 함수 "이다하스켈 기본 클래스

class BasicEq a where 
    isEqual :: a -> a -> Bool 
    isNotEqual :: a -> a -> Bool 
    isNotEqual = not . isEqual 

답변

9

이의이 GHC 프롬프트를 열고 물건의 종류를 살펴 보자 : 당신은 지점이없는 양식을 사용하지 않는 수 a -> a -> Bool이 아닙니다. 우리는 작업 버전을 얻을 수있는 기능 성분을 두배로 할 수있다 :

Prelude> :t ((not .) .) 
((not .) .) :: (a -> a1 -> Bool) -> a -> a1 -> Bool 

그래서 올바른 정의는 다음과 같습니다

isNotEqual x y = not $ isEqual x y 
isNotEqual = curry $ not . uncurry isEqual 

등등

isNotEqual = (not .) . isEqual 

또는 동등를.

6

. 오퍼레이터는 두 개의"단항 함수 "기대 작업. ,

Prelude> :t not 
not :: Bool -> Bool 
Prelude> :t (not .) 
(not .) :: (a -> Bool) -> a -> Bool 

그래서 당신이 (not .)a -> Bool 소요 볼 수 있습니다

isNotEqual x y = not $ isEqual x y