"Lazy evaluation"


[Inhalt]...[Nicht-strike Auswertung]...["Strictness" in Haskell]


3. Strikte Auswertung


3.1 Erklärung

Die meisten Programmiersprachen, insbesondere die imperativen und Objekt-orientierten, werten Ausdrücke strikt aus. In diesem Fall wird ein Ausdruck nie als solcher behandelt, sonder stets zu einem Wert ausgewertet. Daraus resultiert die Tatsache, dass eine Funktion, die auf einem nicht terminierenden Ausdruck arbeitet, selbst nicht terminiert.

Als Beispiel sei eine Funktion gegeben, die zwei ganze Zahlen durcheinander teilt, welche als Parameter übergeben werden. Ist der Divisor (im Beispiel der zweite Parameter) null, wird die Berechnung der Division innerhalb der Funktion einen Fehler auslösen. Das Programm wird, falls keine Fehlerbehandlung besteht, sofort beendet. Die Funktion terminiert nicht, und liefert keinen Wert zurück.

Aufgrund der strikten Auswertung wird von der Funktion "idiv" nicht der Ausdruck a/b zurückgeliefert, sondern sein Wert. Im ersten Fall wird 2/3 zu null ausgewertet, da "drei null mal in zwei passt". Im zweiten Fall muss 2/0 berechnet werden, was zu einem arithmetischen Ausnahmefehler führt, weil der Wert nicht definiert ist. Die Auswertung bricht ab, ebenfalls die Funktion, sowie das gesamte Programm. Ein Rückgabewert ist nicht definiert. Der "Haskell 98 Report" sieht folgende Notation vor: Der Wert eines nicht terminierenden Ausdrucks wird mit "_|_" (sprich engl. "bottom") angegeben.

Die strikte Auswertung spielt insbesondere bei der Parameterübergabe per Wert ("Call-by-value", wie oben) und per Referenz ("Call-by-reference") eine Rolle, welche im folgenden noch einmal vorgestellt werden.

3.2 "Call-by-value"

3.3 "Call-by-reference"



[Inhalt]...[Nicht-strike Auswertung]...["Strictness" in Haskell]