„Strikte Funktion“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Tippfehler entfernt
literatur (strikte sprache)
Zeile 51: Zeile 51:
== Auswertungsstrategie ==
== Auswertungsstrategie ==


Je nach dem welche [[funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|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).
Je nach dem welche [[Auswertung (Informatik)|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 ==
== Literatur ==
Zeile 65: Zeile 65:
| Kommentar=Abschnitt 4.2.1
| Kommentar=Abschnitt 4.2.1
| ISBN = 9780262011532}}
| ISBN = 9780262011532}}
* {{Literatur | Autor = [[Herbert Klaeren]], Michael Sperber | Titel = Die Macht der Abstraktion | Jahr = 2007 | Verlag = Teubner | Ort = Wiesbaden | ISBN = 978-3-8351-0155-5 | Seiten = 250 }}
* {{Literatur | Autor = Peter Pepper, Petra Hofstedt | Titel = Funktionale Programmierung | Jahr = 2006 | Verlag = Springer | Ort = Berlin | ISBN = 978-3-540-20959-1 | Seiten = 32 }}
* {{Literatur | Autor = Peter Pepper, Petra Hofstedt | Titel = Funktionale Programmierung | Jahr = 2006 | Verlag = Springer | Ort = Berlin | ISBN = 978-3-540-20959-1 | Seiten = 32 }}



Version vom 28. Januar 2012, 13:03 Uhr

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

Literatur