Currying - LinkFang.de





Currying


Currying (vor allem in der Linguistik auch Schönfinkeln) ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Funktion mit einem Argument. Obwohl das Verfahren von Moses Schönfinkel[1] erfunden und von Gottlob Frege[2] vorausgedacht wurde, wird es oft nach Haskell Brooks Curry benannt, der das Verfahren letztlich umfangreich theoretisch ausgearbeitet hat.[3]

Verfahren

Es sei eine Funktion gegeben, die n Argumente erfordert. Wird diese auf ein Argument angewendet, so konsumiert sie nur genau dieses und liefert als Funktionswert eine weitere Funktion, die noch n-1 Argumente verlangt. Die zurückgegebene Funktion wird anschließend auf alle weiteren Argumente angewendet.

In Typen ausgedrückt, handelt es sich um die Umrechnung einer Funktion [math]f:A_1\times\ldots\times A_n\to B[/math] zu einer modifizierten Funktion [math]f' :A_1\to(A_2\to( \ldots (A_n\to B) \ldots ))[/math].

Beispiel

Ein Beispiel in Lambda-Notation soll das Verfahren verdeutlichen, wobei die Funktion konkret folgendermaßen definiert sei:

[math] \lambda x\ y\ z\ .\ x\ y\ z [/math]

Die Funktion verlangt also 3 Argumente und gibt diese zurück. Die Definition ist äquivalent zu:

[math] \lambda x.\lambda y.\lambda z\ .\ x\ y\ z [/math]

Bei der Anwendung der Funktion auf die Argumente a, b und c geschieht Folgendes:

[math] \left(\lambda x.\lambda y.\lambda z\ .\ x\ y\ z\right)\ a\ b\ c\ \mathsf{-\ Die\ Anwendung} [/math]

[math] \left(\lambda y.\lambda z\ .\ a\ y\ z\right)\ b\ c [/math]

[math] \left(\lambda z\ .\ a\ b\ z\right)\ c [/math]

[math]a\ b\ c\ \mathsf{-\ Resultat}[/math]

Nach erstmaliger Anwendung der Funktion auf a, b und c wird x im Funktionskörper durch das erste Argument a ersetzt. Das Resultat ist eine Funktion, die noch die Argumente y und z verlangt. Diese wird sofort auf b und c angewendet.

Geometrisches Beispiel

Man kann sich die Situation für eine Funktion mit zwei Argumenten [math]z = f(x, y)[/math] wie folgt vorstellen: das Fixieren einer Argumentvariable entspricht einer Einschränkung der zweidimensionalen Definitionsmenge auf eine eindimensionale Teilmenge, z.B. [math]y = 1[/math], die resultierende Funktion entspricht der Schnittkurve des Graphen von [math]f(x,y)[/math] mit der Ebene aller Punkte [math](x, 1, z)[/math]. Alle Punkte [math](x, y, z)[/math] des Graphen können somit auch durch eine zweistufige Auswahl erreicht werden: zunächst durch die Festlegung der Schnittebene [math]y = 1[/math] und dann durch die Auswertung der Schnittkurve [math]s(x) = f(x, y)|_{y=1}[/math] an der Stelle [math]x[/math].

Anwendung

Currying wird überwiegend in Programmiersprachen und Kalkülen verwendet, in denen Funktionen nur ein einzelnes Argument erhalten dürfen. Dazu gehören beispielsweise ML, Unlambda und der Lambda-Kalkül sowie das nach Curry benannte Haskell. Viele dieser Sprachen bieten dem Programmierer allerdings syntaktische Möglichkeiten, dies zu verschleiern. Ein Beispiel hierfür ist die Äquivalenz der Funktionsdefinition im oben gezeigten Beispiel.

In Programmiersprachen

JavaScript

Das nachfolgende Beispiel zeigt Currying in JavaScript. Zunächst wird eine Funktion addiere definiert, die einerseits als Ergebnis die Summe der beiden Argumente hat, andererseits, wenn sie nur mit einem Argument aufgerufen wird (partielle Anwendung), eine als Closure definierte Funktion zurückgibt.

function addiere(x,y) {
  if (typeof y === "undefined" ) {
    return function (yy) {
      return x + yy;
    }
  }
  return x + y;
}
 
addiere(2,4); // normaler Aufruf. ergibt 6
 
var addiere_zu_drei = addiere(3); // Currying
addiere_zu_drei(5);  // ergibt 8
 
document.write(addiere(2,4) +"<br />")
document.write(addiere_zu_drei(5) +"<br />")

Durch Currying wird die Funktion partiell angewandt, wobei die Funktionsargumente nacheinander übergeben werden und zwischenzeitlich in einer neuen Funktion gehalten werden, die beliebig weiterverwendet werden kann.

Haskell

Currying ist in Haskell essentiell. Jede Funktion erhält, wie oben erwähnt, nur ein Argument. Werden scheinbar mehrere Argumente definiert, so steckt immer Currying dahinter:

addiere x y = x + y
 
addiere 1 3 -- ist äquivalent zu (addiere 1) 3
 
addiereZu2 = addiere 2
 
addiereZu2 1 -- 3

Einzelnachweise

  1. Moses Schönfinkel: Über die Bausteine der mathematischen Logik. In: Mathematische Annalen 92. S. 305–316, Digitalisat .
  2. Gottlob Frege: Grundgesetze der Arithmetik. Hermann Pohle, Jena 1893 (Band I) 1903 (Band II) korpora.org .
  3. Haskell Brooks Curry, Robert Feys, Roger Hindley, Jonathan P. Seldin: Combinatory Logic. North Holland, 2 Bände, 1958, 1972.

Kategorien: Programmierung | Theoretische Informatik

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Currying (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.