Enumerations


... [ Seminar "Einführung in die funktionale Programmiersprache Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ...

Ü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


[ nach oben ]

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 <)


[ nach oben ]

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)


... [ Seminar "Einführung in die funktionale Programmiersprache Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ nach oben ] ...