Vereinigung
|
von zwei oder mehreren Wertebereichen
|
|
Seien t11,t12,...,t1k1,t21,...,tij,...tnkn Variablen für
Datentypen (Wertebereiche)
|
|
und Constr1,...,Constri,...,Constrn
Bezeichner für so genannte Konstruktor-Funktionen
|
|
mit n >= 1
und ki >= 0.
|
data
|
data MyNewType
= Constr1 t11 ... t1k1
| Constr2 t21 ... t2k2
...
| Constrn tn1 ... tnkn
|
|
MyNewType bezeichnet den Wertebereich aller Werte, die mit den Konstruktoren
Constri aus Werten der Bereichen tij gebildet werden können.
|
Namenskonvention
|
Konstruktor-Namen beginnen mit einem Großbuchstaben
|
Beispiele
|
für neue eigene Typen
|
Aufzählungsbereiche |
data Tag
= Sonntag
| Montag
| Dienstag
...
| Sonnabend
|
|
n = 7, ki = 0, keine weiteren Datentypen verwendet, also 7 Werte in dem neuen Wertebereich.
|
der vordefinierte Datentyp Bool |
|
Geld in zwei unterscheidbaren Währungen |
data Money
= Euro Double
| Dollar Double
|
Figuren |
data Shape
= Circle Float
| Rectangle Float Float
|
|
0-stellige Konstruktoren sind wie eigene Konstanten zu betrachten
|
|
Money ist der Wertebereich der Vereinigung zweier Mengen von Zahlen.
Die Werte der einen Menge sind als Euro
markiert, die der anderen
als Dollar,
die Werte sind also durch die Konstruktornamen unterscheidbar.
|
Werte
|
|
Tag |
|
Bool |
|
Money |
|
Shape |
Circle 2.0
Circle (x * y)
Rectangle 2.0 3.0
Rectangle x (sqrt 2.0 * x)
|
|
Alle vordefinierten Typkonstruktoren, ([], (,), (,,), ...) außer -> lassen sich konzeptionell
auf data Definitionen zurückführen.
|
|
In data Definitionen sind Rekursionen erlaubt.
|
|
Bei data Datentypen gilt Namensidentität, keine strukturelle Identität
|
Listen
|
definiert durch data
|
|
type List a = [a]
data List' a = Nil
| Cons a (List' a)
|
|
Nil entspricht []
|
|
Cons entspricht :
|
| |
Selektor
|
Erweiterung: Komponenten können mit einem Namen, einer Selektor-Funktion
versehen werden
|
Beispiel
|
data Money
= Euro { euro :: Double }
| Dollar { dollar :: Double }
data Shape
= Circle { radius :: Float }
| Rectangle { width :: Float
, height :: Float }
|
|
Durch die Selektornamen kann eine Typdefinition
lesbarer gestaltet werden, die Semantik wird nicht verändert. Es werden nur implizit Zugriffsfunktionen eingeführt
|
|
euro :: Money -> Double
dollar :: Money -> Double
radius :: Shape -> Float
width :: Shape -> Float
height :: Shape -> Float
|
|
Die Selektornamen entsprechen den Selector-Namen der record s aus Pascal,
der struct s aus C.
|