„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
→‎Literatur: +Abelson
typo, deutsche Literatur
Zeile 27: Zeile 27:


== Nicht-Strikte Funktionen in strikten Programmiersprachen ==
== Nicht-Strikte Funktionen in strikten Programmiersprachen ==
Eine [[Programmiersprache]] wird als strikt bezeichnet, wenn benutzerdefinierte Funktionen standardmäßig strikt sind.
Eine [[Programmiersprache]] wird als strikt bezeichnet, wenn definierte Funktionen standardmäßig strikt sind.
Auch in Programmiersprachen mit [[Funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|strikter Auswertung]] sind oft einzelne Funktionen vordefiniert, die [[Funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|nicht-strikt]] ausgewertet werden.
Auch in Programmiersprachen mit [[Funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|strikter Auswertung]] sind oft einzelne Funktionen vordefiniert, die [[Funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|nicht-strikt]] ausgewertet werden.


Zeile 40: Zeile 40:
Wäre das [[Disjunktion|Oder]] (<code>||</code>) hier streng, so wäre <var>b</var> undefiniert, falls <var>a</var> gleich 0 wäre. Diese Art der Auswertung wird auch [[Kurzschlussauswertung]] bezeichnet.
Wäre das [[Disjunktion|Oder]] (<code>||</code>) hier streng, so wäre <var>b</var> undefiniert, falls <var>a</var> gleich 0 wäre. Diese Art der Auswertung wird auch [[Kurzschlussauswertung]] bezeichnet.


In [[Funktionale Programmierung|funktionalen Programmiersprachen]] mit strikter Auswertung muss die if-then-else Funktion nicht-strikt definiert sein, damit überhaupt eine Rekursion (die einen if-Ausdruck enthält0 programmiert werden kann. In Pseudo-Code, der [[Pattern Matching|Pattern-Matching]] verwendet:
In [[Funktionale Programmierung|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|Pattern-Matching]] verwendet:


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Zeile 51: Zeile 51:
== Auswertungsstrategie ==
== Auswertungsstrategie ==


Je nach dem welche [[funktionale Programmierung#Bedarfsauswertung und strikte Auswertung|Auswertungsstrategie]] eine funktionale Programmiersprache verwendet, sind benutzerdefinierte 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 [[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).


== Literatur ==
== Literatur ==
Zeile 65: Zeile 65:
| Kommentar=Abschnitt 4.2.1
| Kommentar=Abschnitt 4.2.1
| ISBN = 9780262011532}}
| ISBN = 9780262011532}}
* {{Literatur | Autor = Peter Pepper, Petra Hofstedt | Titel = Funktionale Programmierung | Jahr = 2006 | Verlag = Springer | Ort = Berlin | ISBN = 978-3-540-20959-1 | Seiten = 32 }}


[[Kategorie:Funktionale Programmiersprache]]
[[Kategorie:Funktionale Programmiersprache]]

Version vom 22. Januar 2012, 12:35 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 ausgwertet 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

  • 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, Massachusetts 1996, ISBN 978-0-262-01153-2 (Buch als HTML-Version – Abschnitt 4.2.1).
  • Peter Pepper, Petra Hofstedt: Funktionale Programmierung. Springer, Berlin 2006, ISBN 978-3-540-20959-1, S. 32.