home Funktionale Programmierung: Selbstdefinierte Datentypen Prof. Dr. Uwe Schmidt FH Wedel

Selbstdefinierte Datentypen


weiter

Selbstdefinierte Datentypen

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
merke
n = 7, ki = 0, keine weiteren Datentypen verwendet, also 7 Werte in dem neuen Wertebereich.
der vordefinierte Datentyp Bool
data Bool = False | True
Geld in zwei unterscheidbaren Währungen
data Money
  = Euro   Double
  | Dollar Double
Figuren
data Shape
  = Circle    Float
  | Rectangle Float Float
merke
0-stellige Konstruktoren sind wie eigene Konstanten zu betrachten
merke
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
Sonntag
...
Sonnabend
Bool
False
True
Money
Euro 1.0
Dollar 1.0
Shape
Circle 2.0
Circle (x * y)
 
Rectangle 2.0 3.0
Rectangle x (sqrt 2.0 * x)
merke
Alle vordefinierten Typkonstruktoren, ([], (,), (,,), ...) außer -> lassen sich konzeptionell auf data Definitionen zurückführen.
merke
In data Definitionen sind Rekursionen erlaubt.
merke
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)
merke
Nil entspricht []
merke
Cons entspricht :
weiter
Selektor
Erweiterung: Komponenten können mit einem Namen, einer Selektor-Funktion versehen werden
Beispiel
data Money
  = Euro   { euro   :: Double }
  | Dollar { dollar :: Double }
 
-- Figuren
 
data Shape
  = Circle    { radius :: Float }
  | Rectangle { width  :: Float
              , height :: Float }
merke
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
merke
Die Selektornamen entsprechen den Selector-Namen der records aus Pascal, der structs aus C.

Letzte Änderung: 17.09.2017
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel