私はあなたがクラスの定義だと思っていますが、多分Java/C#/で何がclass
なのでしょうか?
あなたが書く場合:あなただけの型クラスを定義
class Eq a => EQ a where
eq :: a -> a -> Bool
eq = (==)
:型クラスに機能を追加し、制約を記述する方法を。あなたはであり、ではなく、Eq a
がすべてEQ a
であると書いてあります。EQ a
を実装するには、Eq a
も実装する必要があります(少し奇妙です)。
さらに、あなたはデフォルト実装提供していますeq = (==)
を、それはあなたが、実装を指定しないインスタンスのための唯一のデフォルトの実装です。書き込むことによって
:
instance EQ Int where
eq = (==)
あなたは今Int
がEQ
であることを定義しています。あなたは、インスタンスのために書き込むことにより、例えば、より有用なものにすることができます。
instance Eq a => EQ a
は今、あなたはよりEq a
が成立するために、すべてのタイプa
を書かれている、またEQ
のタイプのインスタンスです。しかし、あなたが書いた場合、すぐにEQ
の全公布を定義しているので、の定義ではa
がEQ
のインスタンスに制限されているので、今度は、Haskellユニバース全体でeq
が(==)
に等しいことを意味します。
あなたはおそらく言いたい:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
class EQ a where
eq :: a -> a -> Bool
instance Eq a => EQ a where
eq = (==)
は今、あなたは型クラスEQ
を定義し、Eq a
あるすべてのタイプa
のために、我々は(==)
にeq
を設定し、それはあなたのように、他のタイプの上にEQ
を定義することができますよく、のインスタンスではないdata Foo
のように。ここで2つの拡張をオンにしなければならないことを覚えておいてください。これらはコンパイラ特有のものであり、標準Haskellの一部ではありません。
'class'インスタンスが' instance'を自動的に構築しないためです。 –
@ WillemVanOnsemに感謝します。私は、 'instance'宣言に' where'節を書く必要がないことを認識したはずです。 'instance EQ Int'を書くだけで十分であり、' Int'に 'eq'のデフォルト実装を装備しています。 –