Strikte Funktion
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
[Bearbeiten | Quelltext bearbeiten]In 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
[Bearbeiten | Quelltext bearbeiten]Eine 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
[Bearbeiten | Quelltext bearbeiten]Je 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 | Quelltext 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.