Strikte Funktion

aus Wikipedia, der freien Enzyklopädie

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

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

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

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

  • 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 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.