3

ルーキーの質問、なぜこれがHaskellで正しくないのですか?

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 .)がかかることがわかります。関数構成を 2 倍にして、動作するバージョンを取得できます。a -> Boola -> 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

この.演算子は 2 つの「単項関数」(「x -> y」) を想定していisEqualますが、「2 項関数」(「x -> y -> z」) であるため、機能しません。ポイントフリーフォームは使用できません。

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