In der Informatik heißt eine einstellige Funktion strikt, wenn gilt: Ist ihr Argument undefiniert (, bottom), so ist das Funktionsresultat ebenfalls undefiniert. Also wenn: . Eine mehrstellige Funktion kann jeweils in einzelnen Argumenten oder in allen Argumenten strikt sein. Sind alle Argumente strikt, dann ist die Funktion strikt.
Beispiel
BearbeitenIn Haskell sind definierte Funktionen per default nicht-strikt, aber es gibt Strictness-Annotationen, mit denen man einzelne Argumente als strikt markieren kann. Beispielsweise liefert folgendes Haskell-Programm:
{-# OPTIONS -XBangPatterns #-}
bottom = undefined
f a b = a
f' a !b = a
main = do
print $ f [1,2,3] bottom
print $ f' [1,2,3] bottom
folgende Ausgabe:
[1,2,3] strict: Prelude.undefined
In dem Beispiel ist die Funktion strikt und die Funktion nicht-strikt.
Nicht-Strikte Funktionen in strikten Programmiersprachen
BearbeitenEine Programmiersprache wird als strikt bezeichnet, wenn definierte Funktionen standardmäßig strikt sind. Auch in Programmiersprachen mit strikter Auswertung sind oft einzelne Funktionen vordefiniert, die nicht-strikt ausgewertet werden.
Beispielsweise enthalten imperative Programmiersprachen wie Java oder C den logischen-Oder-Operator (also eine zweistellige Funktion in Infix-Schreibweise), der nicht-strikt ausgewertet wird:
byte a;
boolean b = (a == 0 || 1/a > 0);
Ist a hier gleich 0, so wird der hintere Teil des Ausdruckes nicht mehr ausgewertet.
Wäre das Oder (||
) hier streng, so wäre b undefiniert, falls a gleich 0 wäre. Diese Art der Auswertung wird auch Kurzschlussauswertung bezeichnet.
In funktionalen Programmiersprachen mit strikter Auswertung muss die if-then-else Funktion nicht-strikt definiert sein, damit überhaupt eine Rekursion (die einen if-Ausdruck enthält) programmiert werden kann. In Pseudo-Code, der Pattern-Matching verwendet:
-- if_then_else condition expr1 expr2
if_then_else True expr1 expr2 = expr1
if_then_else False expr1 expr2 = expr2
Auswertungsstrategie
BearbeitenJe nachdem, welche Auswertungsstrategie eine funktionale Programmiersprache verwendet, sind definierte Funktionen standardmäßig strikt oder nicht-strikt. Beispielsweise führt die Auswertungsstrategie left-most/innermost-first zu strikten Funktionen. Die Auswertung bezieht sich auf die Auswahl eines reduzierbaren Ausdruckes (Reducible-Expression, Redex) in einem funktionalen Ausdruck, der noch nicht in Normalform ist. Die Normalform liegt vor, wenn der Ausdruck Redex-frei ist und die Ausführung eines funktionalen Programms entspricht der Überführung des Programms in die Normalform. Die innermost-first-Auswertung wird auch als strikte Auswertung bezeichnet. Intuitiv entspricht dies der Vorgehensweise, dass die Argumente einer Funktion vor dem Funktionsaufruf ausgewertet werden (und nicht erst, wenn sie benötigt werden).
Literatur
Bearbeiten- Richard Bird: Introduction to Functional Programming using Haskell. 2. Auflage. Prentice Hall Europe, 1998, ISBN 0-13-484346-0 (englisch).
- Hal Abelson, Gerald Jay Sussman: Structure and Interpretation of Computer Programs. 2. Auflage. The MIT Press, Cambridge MA 1996, ISBN 978-0-262-01153-2 (Buch als HTML-Version – Abschnitt 4.2.1).
- Herbert Klaeren, Michael Sperber: Die Macht der Abstraktion. Teubner, Wiesbaden 2007, ISBN 978-3-8351-0155-5, S. 250.
- Peter Pepper, Petra Hofstedt: Funktionale Programmierung. Springer, Berlin 2006, ISBN 978-3-540-20959-1, S. 32.