data Typname (Parameter)* = (Konstruktor (Komponente)*)*
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 ] -> ShapeDie 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 RadiusDann 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