신나는 질문, 왜 이것이 하스켈에서 올바르지 않습니까? 그래서 않을 것이다 ("> (Z) - -> Y, X ') - ("> Y X ")를, 그러나 isEqual
는"바이너리 함수 "이다하스켈 기본 클래스
class BasicEq a where
isEqual :: a -> a -> Bool
isNotEqual :: a -> a -> Bool
isNotEqual = not . isEqual
신나는 질문, 왜 이것이 하스켈에서 올바르지 않습니까? 그래서 않을 것이다 ("> (Z) - -> Y, X ') - ("> Y X ")를, 그러나 isEqual
는"바이너리 함수 "이다하스켈 기본 클래스
class BasicEq a where
isEqual :: a -> a -> Bool
isNotEqual :: a -> a -> Bool
isNotEqual = not . isEqual
이의이 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
또는 동등를.
.
오퍼레이터는 두 개의"단항 함수 "기대 작업. ,
Prelude> :t not
not :: Bool -> Bool
Prelude> :t (not .)
(not .) :: (a -> Bool) -> a -> Bool
그래서 당신이 (not .)
이 a -> Bool
소요 볼 수 있습니다
isNotEqual x y = not $ isEqual x y