2013-10-21 6 views
6

Eq typeclassの実装はどのように機能しますか? IntやFloatなどの実装を簡単に記述できます。しかし、可能性のあるすべての値コンストラクタに対してパターンマッチのようなことをする必要があるので、どのようにすべてのユーザタイプのキャッチオールが行われますか?私はこれを行うための構文を認識していない。Eq typeclassはユーザー定義型に対してどのように実装されていますか?

data Person = Person { firstName :: String 
        , lastName :: String 
        , age :: Int 
        } deriving (Eq) 

答えて

6

パターンは、あなたが言ったように、すべての値コンストラクタと一致します。あなたはファイル内のコードを入れて-ddump-derivghcを実行した場合、ここであなたが得るものです:あなたが行うことができます

==================== Derived instances ==================== 
Derived instances: 
    instance GHC.Classes.Eq Main.Person where 
    GHC.Classes.== 
     (Main.Person a1_alh a2_ali a3_alj) 
     (Main.Person b1_alk b2_all b3_alm) 
     = ((((a1_alh GHC.Classes.== b1_alk)) 
      GHC.Classes.&& ((a2_ali GHC.Classes.== b2_all))) 
     GHC.Classes.&& ((a3_alj GHC.Classes.== b3_alm))) 
    GHC.Classes./= a_aln b_alo 
     = GHC.Classes.not ((GHC.Classes.==) a_aln b_alo) 
+0

':GHCiの中-ddump-deriv'を設定しすぎ –

+1

ああ、それはインスタンスコードを生成しますので、具体的にはタイプPerson用です。私は、すでに書かれたコードが使用されているという誤った印象のもとにいました。しかし、インスタンスコードを生成する方法をどのように知っていますか?それはハスケル自体に焼かれていますか? – user782220

+1

@ user782220基本的にはい、それは焼き尽くされています。そのため、特定の型クラスでのみ 'deriving'を使うことができます。どの型でも動作する可能性のあるHaskellコードはありませんので、型固有のロジックが必要です(そのため、等価は多型関数ではなく型クラス関数です)。 GHCには "明白な" Eq'インスタンスを生成するためのロジックが含まれています。 – Ben

関連する問題