homeSoftwaredesign Softwaredesign: Neue selbstdefinierte Wertebereiche und Summen-Datentypen Prof. Dr. Uwe Schmidt FH Wedel

Neue selbstdefinierte Wertebereiche und Summen-Datentypen


weiter

Summen-Typkonstruktor

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
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 bisherigen Typkonstruktoren, außer -> lassen sich konzeptionell auf data Definitionen zurückführen.
merke
In data Deklarationen sind Rekursionen erlaubt.
merke
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)
merke
Nil entspricht []
merke
Cons entspricht :
weiter
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)).
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: 26.10.2016
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel