Vorlesung: Praxis der Funktionalen Programmierung


Algebraische Datentypen

data Typname (Parameter)* = (Konstruktor (Komponente)*)*
Beispiel (SOE, Seite 24)
data Shape = Rectangle Side Side
           | Ellipse Radius Radius
	   | Polygon [ Vertex ]
Hier ist Shape der neu definierte algebraische Datentyp, er hat keine Parameter, Rectangle, Ellipse und Polygon sind die Konstruktoren, die ersten beiden sind zweistellig, der letzte ist einstellig.

Die Konstruktoren sind Funktionen, haben also Typen, Beispiel:

Polygon :: [ Vertex ] -> Shape
Die Konstruktoren verwenden wir beim Mustersuchen (SOE, Seite 25 f)
area :: Shape -> Float
area (Rectangle x y) = x * y
area (Ellipse a b) = pi * a * b
area (Polygon ps) = ...
In einem Sichtbarkeitsbereich (Modul) darf es jeden Konstruktor nur einmal geben. Das folgende geht also nicht:
data Shape = ... (wie oben)
data Round = Circle Radius
           | Ellipse Radius Radius
Dann wüßte man nämlich nicht, welchen Typ der Ausdruck Ellipse 1.0 2.0 haben soll (Shape oder Round). Man könnte das durch Nachschlagen im Kontext herausbekommen, falls der Programmierer eine umgebende Typdeklaration geschrieben hat. Das muß er aber in Haskell (leider) nicht, deswegen geht das nicht.

Zwei wichtige Typen aus der Prelude sind

data Maybe a = Nothing | Just a
data Either a b = Left a | Right b

best viewed with any browser


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