2017-03-24 2 views
1

Ich muss meine eigene Typklasse deklarieren, aber ich verstehe nicht, warum es das (==) gibt.Haskell eigene Instanz typeclass

data Egg = Soft | Hard 

instance Eq Egg where 
(==) 

ich habe nichts gefunden, wo die (==) in einer Instanz verwendet wird, nur in einer Klasse

Antwort

4

Die einfache Art und Weise eine Instanz von Eq zu haben ist:

data Egg = Soft | Hard deriving Eq 

die harte Weise (mit mehr Kontrolle):

data Egg = Soft | Hard 

instance Eq Egg where 
    Soft == Soft = True 
    Hard == Hard = True 
    _ == _ = False 

UPD: Da die Gleichheit Funktion (==) als Betreiber scheinen die verwirrende Bit zu sein, hier ist die gleiche Instanz mit einer Präfixnotation geschrieben:

data Egg = Soft | Hard 

instance Eq Egg where 
    (==) Soft Soft = True 
    (==) Hard Hard = True 
    (==) _ _ = False 

Als kleine Erinnerung: Betreiber sind Infix (zwischen Begriffen) Standardmäßig sind Funktionen standardmäßig Präfix (vor Termen). Um ein Operator-Präfix zu erstellen, wird es von () umgeben. Um eine Funktion zu erstellen, wird es von `` umgeben. Here ist ein Thread, der darüber spricht, welche Zeichen für Operator vs Funktionen verwendet werden.

+0

das ist, was ich als gut gedacht, aber sie schrieb bereits Instanz Eq Egg, wo (==) und ich brauche die abzuschließen Code. Das (==) verwirrt mich so sehr – Lorenzo

+0

Sind Sie verwirrt über den Operator (==)? Ich werde meine Lösung bearbeiten, um eine Präfix-Version anzuzeigen –

+0

Ich bin so dumm, danke für Ihre Antwort! Total vergessen, dass das ein Präfix ist – Lorenzo

1

Ich nehme an, Sie versuchen, eine Instanz der Standardtypenklasse Eq für Ihren benutzerdefinierten Datentyp zu machen. Die Eq Klasse ist definiert als:

class Eq a where 

    (==) :: a -> a -> Bool 
    a == b = not (a /= b) 

    (/=) :: a -> a -> Bool 
    a /= b = not (a == b) 

Das heißt, es definiert zwei Methoden == und /= (die Operatoren geschehen sein), und liefert Standardimplementierungen von jeder in Bezug auf den anderen. Um also eine Instanz von Eq für Ihren eigenen Typ zu erstellen, müssen Sie eine Implementierung einer oder beider dieser Funktionen (== oder /=) für Ihren Typ bereitstellen. Beachten Sie, dass der Körper der instance eingerückt sein muss.

instance Eq Egg where 
    Soft == Soft = True 
    Hard == Hard = True 
    _ == _ = False 

So wie Sie von ein Haskell Operator in Präfix-Formular kann in Klammern Einwickeln, zB (==) 1 1, können Sie auch implementieren einen Operator Definition in Präfix Form:

instance Eq Egg where 
    (==) Soft Soft = True 
    (==) Hard Hard = True 
    (==) _ _ = False 

Sie könnten sogar eine case verwenden, wenn Sie dies wünschen:

Beachten Sie, dass diese alle die gleiche wie die Instanz, die automatisch für Sie mit deriving erzeugt würden:

data Egg = Soft | Hard 
    deriving (Eq) 
+0

danke! Ich war verwirrt über die Präfixform – Lorenzo

Verwandte Themen