|
type Deklarationen und data Definitionen
können mit Typparametern versehen werden.
|
|
Dadurch werden die Aliasnamen (type) und
selbstdefinierten Typnamen
(data) zu Typkonstruktoren
|
|
Funktionen über diesen parametrisierten Datentypen
sind dann auch polymorph (vielgestaltig)
|
|
Diese Polymorphe wird parametrische Polymorphe genannt.
|
|
Typparameter entsprechen den Templates in C++ und den Generics in Java 1.5
|
Beispiel
|
explizite Definition von Listen
|
|
data List a = Nil
| Cons a (List a)
|
vordefinierte parametrische Summentypen
|
|
Maybe |
data Maybe t
= Nothing
| Just t
|
|
Maybe t enthält einen Wert mehr als
t
|
|
Explizite Kennzeichnung, dass ein Wert nicht vorhanden ist.
|
|
In OOP null-Referenz manchmal genutzt zur Darstellung von Nothing, ist aber nicht explizit in der Quelle sichtbar.
Konsequenz: NullPointerException
|
Anwendungen
|
type OptionalInt = Maybe Int
Nothing, Just 1, Just 2, ...
|
typische Verwendung |
lookup :: key -> Map key val -> Maybe val
lookup k m
| found k = Just v
| otherwise = Nothing
where
v = ...
|
|
Anwendung: Aus partiell definierten Funktionen total definierte machen
|
|
Fehler durch Nothing repräsentieren
|
| |
Either |
entweder / oder
|
|
Summe zweier Wertebereiche
|
|
data Either a b
= Left a
| Right b
|
Anwendungen
|
type IntOrError = Either Error Int
Left "division by zero"
Right 5
|
|
Maybe und Either
sind neue Typkonstruktoren wie [ ] und ( , ).
|