ルーキーの質問、なぜこれがHaskellで正しくないのですか?
class BasicEq a where
isEqual :: a -> a -> Bool
isNotEqual :: a -> a -> Bool
isNotEqual = not . isEqual
ルーキーの質問、なぜこれがHaskellで正しくないのですか?
class BasicEq a where
isEqual :: a -> a -> Bool
isNotEqual :: a -> a -> Bool
isNotEqual = not . isEqual
GHC プロンプトを開いて、種類を見てみましょう。
Prelude> :t not
not :: Bool -> Bool
Prelude> :t (not .)
(not .) :: (a -> Bool) -> a -> Bool
したがって、ではなく(not .)
がかかることがわかります。関数構成を 2 倍にして、動作するバージョンを取得できます。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
など。
この.
演算子は 2 つの「単項関数」(「x -> y」) を想定していisEqual
ますが、「2 項関数」(「x -> y -> z」) であるため、機能しません。ポイントフリーフォームは使用できません。
isNotEqual x y = not $ isEqual x y