私は自分のtypeclassを宣言する必要がありますが、なぜ(==)があるのかわかりません。ハスケル独自のインスタンス型クラス
data Egg = Soft | Hard
instance Eq Egg where
(==)
私は(==)Eq
のインスタンスを持っている唯一のクラス
私は自分のtypeclassを宣言する必要がありますが、なぜ(==)があるのかわかりません。ハスケル独自のインスタンス型クラス
data Egg = Soft | Hard
instance Eq Egg where
(==)
私は(==)Eq
のインスタンスを持っている唯一のクラス
簡単な方法で、インスタンスで使用されているものを見つけられませんでしたです:
data Egg = Soft | Hard deriving Eq
(より多くのコントロールを持つ)ハード方法:
data Egg = Soft | Hard
instance Eq Egg where
Soft == Soft = True
Hard == Hard = True
_ == _ = False
UPD:等価関数(==)ので、オペレータはここで、混乱ビットように見えるように、プレフィックス表記で書かれた同じインスタンスである:クイックリマインダとして
data Egg = Soft | Hard
instance Eq Egg where
(==) Soft Soft = True
(==) Hard Hard = True
(==) _ _ = False
:オペレータは、ターム間に(インフィックスあります)がデフォルトであり、関数はデフォルトでプレフィックス(用語前)です。演算子の接頭辞を作るには、()
で囲んで、中に関数で囲んでいます。 Hereは、演算子と関数のどちらの文字が使用されているかを示すスレッドです。
の標準型のEq
をカスタムデータ型にしようとしているとします。 Eq
クラスは次のように定義される。すなわち
class Eq a where
(==) :: a -> a -> Bool
a == b = not (a /= b)
(/=) :: a -> a -> Bool
a /= b = not (a == b)
、それは(オペレータことが起こる)の二つの方法==
と/=
を定義し、他の点でそれぞれのデフォルトの実装を提供します。したがって、自分のタイプのインスタンスをEq
にするには、あなたのタイプにこれらの関数(==
または/=
)のいずれかまたは両方の実装を提供する必要があります。 instance
の本文はインデントしなければならないことに注意してください。
instance Eq Egg where
(==) Soft Soft = True
(==) Hard Hard = True
(==) _ _ = False
:あなたは(==) 1 1
、例えば、括弧でそれをラップすることにより、プレフィックス形式でHaskellの演算子を使用して、あなたもプレフィックス形式でオペレータの定義を実装することができますことができるように
instance Eq Egg where
Soft == Soft = True
Hard == Hard = True
_ == _ = False
必要に応じてcase
を使用することもできます。
instance Eq Egg where
(==) a b = case (a, b) of
(Soft, Soft) -> True
(Hard, Hard) -> True
_ -> False
data Egg = Soft | Hard
deriving (Eq)
ありがとうございます!私は接頭辞の形式について混乱していた – Lorenzo
は私がaswell考えたものthatsのが、彼らはすでに(==)インスタンス式卵を書いて、私が完了する必要があります。これらは
deriving
で自動的に生成されるインスタンスとすべて同じであること注意コード。 (==)は私をとても混乱させます – Lorenzoオペレータ(==)について混乱していますか?プレフィックスのバージョンを表示するように私のソリューションを編集します –
私はとてもばかげています、あなたの答えをありがとう!プレフィックスであることを完全に忘れてしまった – Lorenzo