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 SumType
= Constr1 t11 ... t1k1
| Constr2 t21 ... t2k2
...
| Constrn tn1 ... tnkn
|
|
SumType bezeichnet den Wertebereich aller Werte, die mit den Konstruktoren
Constri aus Werten aus den 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 bisherigen Typkonstruktoren, außer -> lassen sich konzeptionell
auf data Definitionen zurückführen.
|
|
In data Deklarationen sind Rekursionen erlaubt.
|
|
Bei data Datentypen 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 :
|
| |
Korrespondenz |
zu Java und OMT
|
|
In Java wird der neue Datentyp
(Tag, Bool, Money, Shape) zu einer
abstrakten Klasse.
|
|
Aus jedem Konstruktor wird eine beerbende konkrete Klasse mit den
entsprechenden Datenfeldern.
|
|
jeder Wert (Circle (x*y)) wird zu einem Konstruktoraufruf
(new Circle (x*y)).
|
| |
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 records aus Pascal,
der structs aus C.
|