Weiter Zurück Inhalt

1. Einleitung

Haskell ist eine pure funktionale Sprache. Das bedeutet, daß das Ergebnis einer Funktion nur von ihren Parametern abhängt. Eine Funktion kann keinerlei Seiteneffekte auslösen, oder von äußeren Zuständen abhängig sein. Dadurch ist es einfach, über eine Funktion zu Argumentieren, oder deren Korrektheit zu beweisen.

Weil die Sprache pur ist, macht es keinen Unterschied, in welcher Reihenfolge Werte berechnet werden. Wenn ein Wert für das Ergebnis des gesamten Programms nicht benötigt wird, muß dieser auch nicht berechnet werden. Es ist also nicht vorherzusehen, wann und ob, eine bestimmte Funktion ausgewertet wird.

Mit einem Monad ist es unter Anderem möglich, die Reihenfolge von Berechnungen festzulegen, und deren Berechnung zu erzwingen.

Die hier vorgestellten Konzepte von Monads sind in der Sprache Haskell verdeutlicht, können aber direkt auf die meisten anderen funktionalen Sprachen, wie z.B. ML, Erlang oder Scheme [2] übertragen werden.

1.1 Das Problem der Seiteneffekte bei der Ein- und Ausgabe

Weil sich die Reihenfolge der Auswertung nicht vorhersehen lässt, hätte das Einführen von verborgenen Seiteneffekten schwere Auswirkungen auf die Semantik der Sprache.

Es wäre z.B. nicht mehr möglich mathematische Aussagen über das Verhalten von Funktionen aufzustellen. Als Beispiel sei eine Funktion readInt definiert, die einen Integer-Wert einliest, und eine Funktion foo, die readInt verwendet.

readInt :: Int

foo = readInt - readInt
Es ist nicht möglich über das Verhalten der Funktion foo eine Aussage zu treffen. Das Ergebnis dieser Funktion ist nicht nur von einer Eingabe von außen, sondern auch von der Reihenfolge der Auswertung abhängig. Ein optimierender Compiler könnte folgern, daß foo = 0 ist, und somit alle Seiteneffekte verhindern.

Es ist also notwendig, eine Struktur einzuführen, die es ermöglicht, sequentielle Abläufe zu beschreiben.


Weiter Zurück Inhalt