2016-04-14 21 views
3

Ich kam zu wissen, dass wir mehrere Vererbung mit Typklassen erreichen können. Ich hatte einen kleinen Haskell-Code geschrieben, konnte aber das Problem nicht lösen.Haskell: Typ Klassen: multiple Vererbung Beispiel

{-# 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 

Wenn ich versuchte, über Code zu laden, erhalte ich folgenden Fehler. Irgendeine Hilfe dazu.

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. 

Ich suchte Google einige Zeit, aber nicht in der Lage, gutes Beispiel für Mehrfachvererbung zu finden. Es wird hilfreich sein, wenn Sie einige Informationen bereitstellen, beispielsweise zur Mehrfachvererbung in Haskell.

Referenz: https://www.haskell.org/tutorial/classes.html

Antwort

7

sagen

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

bedeutet nicht, dass Typen, die C automatisch implementieren Eq und Show implementieren, bedeutet dies, dass sie zum ersten Mal Eq und Show implementieren müssen, bevor sie C umsetzen können.

A class in Haskell ist nicht das gleiche wie ein class in Java, entweder, es ist näher an eine Schnittstelle, aber es kann nicht auf die gleiche Weise (und sollte nicht) verwendet werden. Haskell hat kein Konzept der Vererbung oder Klassen im OOP-Sinne, da es keine OOP-Sprache ist.

Wenn Sie jedoch Eq und Show Instanzen automatisch für einen Typ haben möchten, fügen Sie sie einfach zur deriving-Klausel des Datentyps hinzu.

+0

Danke für die Antwort. Wir können mehr als eine Typklasse ableiten, aber meine Frage war, ich möchte die Anweisung 'class (Eq a, Zeige a) => C a where' verwenden, mit dieser wie kann ich den Fehler auflösen. –