Vorlesung: Praxis der Funktionalen Programmierung


Typ-Synonyme

erklären keinen neuen Typ, sondern einer neuen Namen für einen bereits bestehenden Typ. Sie werden durch den Compiler (wie Macros) expandiert.
type Typname (Parameter)* = Typ-Ausdruck
Sie haben die gleichen Vor- und Nachteile wie Macros in C: bei sorgsamer Benutzung erhöhen sie die Übersichtlichkeit, aber der Compiler kann das nicht vom Programmierer erzwingen. Beispiel (SOE Seite 24)
type Radius = Float
type Side = Float
Die Aussage Rectangle :: Side -> Side -> Shape sieht schön aus, aber Rectangle :: Float -> Radius -> Shape wird vom Compiler genauso akzeptiert.

Mit Typ-Synonymen können wir also Abstraktionen nicht wirklich durchsetzen. Das richtige Mittel dazu sind Algebraischen Datentypen, deren Konstruktoren nicht exportiert werden (siehe später mehr über Module).


Algebraische Datentypen mit benannten Komponenten

data Typname (Parameter)* = ( Konstruktor { name :: Type, ... } )*
Das erklärt wie oben eine Menge von Konstruktoren mit entsprechenden Typen und Stelligkeiten und zusätzlich eine Menge von Zugriffsfunktionen.

Beispiel (kompletter Quelltext)

type Winkel = Rational
type Winkels = [ Winkel ]

data Ecke   = Ecke { sichtbar :: Winkel
                   , alle :: Winkels
                   }

data Streckenzug = Streckenzug  [ Ecke ]
Ausdrücke vom Typ Ecke bauen wir so (Beispiel: reguläres Polygon?)
e :: Ecke
e = Ecke { sichtbar = 1 % 2, alle = [ 1 % 2 ] }
und wir können benannte Muster benutzen:
länge (Ecke { alle = ws }) = length ws
Die Namen "sichtbar", "alle" sind auch Zugriffsfunktionen:
sichtbar :: Ecke -> Winkel
alle     :: Ecke -> Winkels
Wir können (leider?) die Konstruktoren mit benannten Komponenten auch in der unbenannten Version benutzen.

Anwendung von Datentypen

Wir interessieren uns für Listen (Warteschlangen) mit Abständen (Wartezeiten) zwischen den Elementen. Das brauchen wir später bei der Musik. Wir können Warteschlangen nacheinander oder nebeneinander ausführen. (Quelltext.) Das Nebeneinander ist sehr ähnlich zum merge bei mergesort.

best viewed with any browser


http://www.informatik.uni-leipzig.de/~joe/ mailto:joe@informatik.uni-leipzig.de