Gegeben seien folgende Funktionen:
inputInt :: Int inputDiff :: Int inputDiff = inputInt - inputInt
Die Funktion inputInt
liefert eine eingebene Zahl und die
Funktion inputDiff
die Differenz von zwei eingegeben
Zahlen zurück.
Nun gibt es ein Problem bei funktionalen Programmiersprachen: die
Auswertungsreihenfolge ist unbekannt. Werden nun zwei Zahlen in der
Reihenfolge 7 und 3 eingegeben und die Funktion
inputDiff
von links ausgewertet, so ist das Ergebnis
3, von rechts ausgewertet ist das Ergebnis -3. Somit kann die Funktion
inputDiff
zwei verschiedene Ergebnisse zurückliefern und dies ist
nicht erlaubt.
Zusätzlich kann der Compiler die Funktion auch optimieren. Da normalerweise
Funktionen immer das gleiche Ergebnis zurückliefern, kann der Compiler die
Rückgabe von inputDiff
zu null reduzieren.
Um diese beiden Verhaltensweisen zu verhindern, wurde ein Konzept entwickelt: der Monad. Zunächst wird auf den IO Monad eingegangen, danach wird ein Evaluierer ohne Monad entwickelt und einige Features hinzugefügt. Danach wird der selbe Evaluierer mit Monaden erstellt.