Statische Typsysteme haben zahlreiche Vorteile. Der naheliegendste Vorteil ist
vermutlich, dass mögliche Laufzeitfehler verhindert werden.
Stellen wir uns zum Beispiel vor, wir wollten SQL-Anfragen modellieren. Wählen
wir einen String
als Repräsentation, so können wir ohne weiteres syntaktisch
inkorrekte Anfragen basteln, und haben keinen hohen Grad an Sicherheit. Wählen
wir statt dessen einen spezifischen Datentyp SQL
, der einen abstrakten
Syntaxbaum modelliert, so können wir uns auf syntaktische Korrektheit verlassen,
aber wir können noch immer andere Fehler machen. Was, wenn wir sicherstellen
wollten, dass die verwendeten Namen von Tabellen und Feldern tatsächlich in
unserer Datenbank enthalten sind? Was, wenn wir garantieren wollen, dass wir
SQL-Operatoren in typkorrekter Art und Weise verwenden wollen? Es ist einfach,
sich vorzustellen, dass wir dies durch Tests zur Laufzeit sicherstellen können.
Aber ist es auch möglich, dies bereits durch statische Typen zu garantieren?
Ein einfacheres Beispiel: Wir haben eine Applikation, die Fragebögen und
zugehörige Antworten verwaltet. Es gibt verschiedene Sorten von Fragen. Manche
Fragen sollten mit „Ja“ oder „Nein“ beantwortet werden, andere mit einer
Antwort aus einer vorgegebenen Auswahl, wieder andere mit einer quantitativen
Angabe. Sicher können wir Datentypen definieren, die die verschiedenen Sorten
von Fragen und die verschiedenen Sorten von Antworten modellieren. Aber wenn wir
nun Fragen und zugehörige Antworten haben, wie wissen wir dann, dass die Sorten
der Fragen und die Sorten der Antworten zueinander passen? Wiederum ist es
einfach, dies zur dynamisch zu testen. Es ist nicht ganz so einfach – aber
durchaus möglich – dies auch statisch im Typsystem sicherzustellen.
Das Sprachmittel, welches wir dazu verwenden werden, heißt „GADT“. Die
Abkürzung steht für „Generalized Algebraic Data Type“, zu Deutsch
„generalisierter algebraischer Datentyp“. GADTs stehen in Haskell bereits seit
vielen Jahren als Spracherweiterung zur Verfügung (und werden vermutlich auch
irgendwann in den Standard Einzug halten), und sind mittlerweile auch in einigen
anderen Programmiersprachen verfügbar.
Im folgenden will ich das Beispiel mit den Fragebögen in Haskell etwas näher
beleuchten. Zunächst werden wir mit normalen Sprachmitteln skizzieren, wie man
eine solche Applikation in Haskell implementieren könnte. Dann werden wir sehen,
an welcher Stelle die Verwendung von GADTs sinnvoll wird, und was GADTs genau
sind.
Weiterlesen...