2016-04-14 22 views
3

私は、型クラスを使用して複数の継承を実現できることを知りました。私は小さなhaskellコードを書いていたが、問題を理解することができなかった。Haskell:型クラス:多重継承の例

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE DeriveAnyClass #-} 
{-# LANGUAGE StandaloneDeriving #-} 

class (Eq a, Show a) => C a where 
    getHashCode :: a -> Integer 
    getHashCode obj = 123 


type Id = Int 
type Name = String 

data Employee = Employee Id Name deriving C 

上記のコードを読み込もうとしましたが、次のエラーが発生しています。これに関する助け

No instance for (Eq Employee) 
     arising from the 'deriving' clause of a data type declaration 
    Possible fix: 
     use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
    When deriving the instance for (C Employee) 
Failed, modules loaded: none. 

私はしばらくGoogleを検索しましたが、複数の継承の良い例は見つかりませんでした。 Haskellでの複数の継承に関する例をいくつか提供すると役に立ちます。

参考:https://www.haskell.org/tutorial/classes.html

答えて

7

class (Eq a, Show a) => C a where 

を言うことはCを実装するタイプが自動的にEqShowを実装することを意味するものではありません、それは彼らがCを実装することができます前に、彼らが最初にEqShowを実装しなければならないことを意味します。

ハスケルのclassは、Javaのclassと同じでもなく、インタフェースに近いですが、同じ方法で使用することはできません。 HaskellはOOP言語ではないので、実際にはOOPの意味での継承やクラスの概念を持っていません。

ただし、EqShowインスタンスを自動的に型に追加する場合は、データ型のderiving句に追加してください。

+0

お返事ありがとうございます。私は複数の型クラスを派生することができますが、私の質問は、 'クラス(Eq a、Show a)=> C a where'というステートメントを使いたいのです。 –