2017-03-24 7 views
1

私は自分のtypeclassを宣言する必要がありますが、なぜ(==)があるのか​​わかりません。ハスケル独自のインスタンス型クラス

data Egg = Soft | Hard 

instance Eq Egg where 
(==) 

私は(==)Eqのインスタンスを持っている唯一のクラス

答えて

4

簡単な方法で、インスタンスで使用されているものを見つけられませんでしたです:

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は、演算子と関数のどちらの文字が使用されているかを示すスレッドです。

+0

は私がaswell考えたものthatsのが、彼らはすでに(==)インスタンス式卵を書いて、私が完了する必要があります。これらはderivingで自動的に生成されるインスタンスとすべて同じであること注意コード。 (==)は私をとても混乱させます – Lorenzo

+0

オペレータ(==)について混乱していますか?プレフィックスのバージョンを表示するように私のソリューションを編集します –

+0

私はとてもばかげています、あなたの答えをありがとう!プレフィックスであることを完全に忘れてしまった – Lorenzo

1

の標準型の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) 
+0

ありがとうございます!私は接頭辞の形式について混乱していた – Lorenzo

関連する問題