菜鸟问题,为什么在Haskell中这不正确?
class BasicEq a where
isEqual :: a -> a -> Bool
isNotEqual :: a -> a -> Bool
isNotEqual = not . isEqual
答案 0 :(得分:9)
让我们打开GHC提示并查看事物的类型:
Prelude> :t not
not :: Bool -> Bool
Prelude> :t (not .)
(not .) :: (a -> Bool) -> a -> Bool
因此,您可以看到(not .)
需要a -> Bool
,而不是a -> a -> Bool
。我们可以将函数组合加倍以获得工作版本:
Prelude> :t ((not .) .)
((not .) .) :: (a -> a1 -> Bool) -> a -> a1 -> Bool
所以正确的定义是:
isNotEqual = (not .) . isEqual
或等效地,
isNotEqual x y = not $ isEqual x y
isNotEqual = curry $ not . uncurry isEqual
等等。
答案 1 :(得分:6)
.
运算符需要两个“一元函数”(“x - > y”),但isEqual
是“二元函数”(“x - > y - > z” ),所以它不会起作用。你可以不使用无点形式:
isNotEqual x y = not $ isEqual x y