Currying

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Currying (selten auch: Schönfinkeln) ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Funktion mit einem Argument. Obwohl das Verfahren von Moses Schönfinkel und Gottlob Frege erfunden wurde, ist es nach Haskell Brooks Curry benannt.

[Bearbeiten] 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 f:A_1\times\ldots\times A_n\to B zu einer modifizierten Funktion f':A_1\to(A_2\to(\ldots(A_n\to B)\ldots)).

[Bearbeiten] Beispiel

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


\lambda x\ y\ z\ .\ x\ y\ z

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


\lambda x.\lambda y.\lambda z\ .\ x\ y\ z

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


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


\left(\lambda y.\lambda z\ .\ a\ y\ z\right)\ b\ c


\left(\lambda z\ .\ a\ b\ z\right)\ c

a\ b\ c\ \mathsf{-\ Resultat}

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.

[Bearbeiten] 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 und 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.

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Mitmachen
Drucken/exportieren
Werkzeuge
In anderen Sprachen