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.
Inhaltsverzeichnis |
[Bearbeiten] Beispiel
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.
[Bearbeiten] Nicht-Strikte Funktionen in strikten Programmiersprachen
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
[Bearbeiten] Auswertungsstrategie
Je nach dem 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).
[Bearbeiten] Literatur
- Richard Bird: Introduction to Functional Programming using Haskell. 2. Auflage. Prentice Hall Europe, 1998, ISBN 0-13-484346-0.
- Hal Abelson, Gerald Jay Sussman: Structure and Interpretation of Computer Programs. 2. Auflage. The MIT Press, Cambridge, Massachusetts 1996, ISBN 9780262011532 (Abschnitt 4.2.1, Buch als HTML-Version).
- 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.