Strikte Funktion

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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]