3

菜鸟问题,为什么这在 H​​askell 中不正确?

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

2 回答 2

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

等等。

于 2012-10-24T13:18:42.740 回答
6

运算符需要两个“.一元函数”(“x -> y”),但isEqual它是一个“二元函数”(“x -> y -> z”),所以它不起作用。你可以不使用无点形式:

isNotEqual x y = not $ isEqual x y
于 2012-10-24T13:17:35.313 回答