Enumerations
Übersicht: Enumerations
Deklaration
Enumerations sind kein eigener Typ wie Bool
oder Char
. Vielmehr sind
Enumeratione ein Art und Weise der Datentypdeklaration.
Die beiden eben genannten Typen sind
auf diese Art und Weise deklariert worden. Hierbei werden alle Werte direkt angegeben und durch
|
getrennt. Die Werte sind Konstruktoren und müssen in Grossbuchstaben geschrieben
werden.
Es folgt die Definition eines eigenen Typs, der in Haskell nicht vorhanden ist.
01 data Tag = So | Mo | Di | Mi | Do | Fr | Sa
|
Instanziierung von Typklassen
Für die meisten Enumerations ist es sinnvoll Instanzen von Eq
und Ord
zu definieren. Allerdings steigt die Anzahl der Fallunterscheidungen mit der Anzahl der Werte
des definierten Datentyps und es ist meist zu aufwändig die Instanzen zu definieren.
Aus diesem Grund gibt es eine Typklasse Enum
die die Enumeration in Int
konvertiert und umgekehrt. Ihre Definition lautet:
01 class Enum a where
02 toEnum :: a -> Int
03 fromEnum :: Int -> a
|
Es folgen Beispiele für Instanzdeklarationen, die im Falle von Char
wieder einfache,
bereits definierte Funktionen verwenden.
01 instance Enum Tag where
02 toEnum So = 0
03 toEnum Mo = 1
04 toEnum Di = 2
05 toEnum Mi = 3
06 toEnum Do = 4
07 toEnum Fr = 5
08 toEnum Sa = 6
09
10 instance Enum Char where
11 toEnum = ord
12 fromEnum = chr
|
Durch diesen Ansatz lassen sich leicht Instanzen für die Typklassen Eq
und Char
definieren.
01 instance Eq Tag where
02 (x == y) = (toEnum x == toEnum y)
03
04 instance Ord Tag where
05 (x < y) = (toEnum x < toEnum <)
|
Automatische Instanzdeklaration
Da sich die Instanzen für Enumerations leicht berechnen lassen, kann man diese vom Compiler erstellen lassen.
Um dem Compiler die Anweisung zu geben, Instanzen von Typklassen automatisch zu berechnen, gibt man bei der
Datentypdefinition das Schlüsselwort deriving
und die entsprechenden Typklassen an.
Die automatische Generation von Instanzen funktioniert nur für Enumerations, bei denen die Werte direkt
angegeben werden. Es lassen sich damit beispielsweise Instanzen für Eq, Ord
und Enum
berechnen.
01 data Tag = So | Mo | Di | Mi | Do | Fr | Sa
02 deriving (Eq,Ord,Enum)
|