currying



Curry (im Allgemeinen in der Sprache von Schönfinkeln ) ist die Umwandlung einer Funktion mit mehreren Argumenten in dit Functie mit einem Argument. Obwohl das Elle Verfahren von Moses Schönfinkel [1] erfunden und von Gottlob Frege [2] vorausgedacht Wurde, Wird es oft nach Haskell Brooks Curry benannt, wo das Elle Verfahren letztlich Umfangreiche theoretisch ausgearbeitet Hass. [3]

Verfahren

Es sei Eine Funktion gegeben, sterben n Argumente Necessesary. Wird This auf ein Argument angewendet, so konsumiert sie nur genau Dieses und liefert als Funktionswert Eine weitere Funktion, sterben noch n-1 Argumente verlangt. Die zurückgegebene Funktion wird nachfolgend auf alle weiteren Argumenten angewendet.

In Types ausgedrückt fungiert es als die Umrechnung einer Funktion {\ displaystyle f \ Doppelpunkt A_ {1} \ times \ ldots \ Zeiten A_ {n} \ bis B} zu einer modifizierten Funktion {\ displaystyle f ‚\ Doppelpunkt A_ {1} \ bis {A_ {2} \ bis (\ lDots (A_ {n} \ bis B) \ ldots)}}.

Beispiel

Ein Beispiel in Lambda-Notation soll das Verfahren verdeutlichen, wo die Funktion konkret

{\ displaystyle \ lambda x \ y \ z \. \ x \ y \ z}

Die Funktion benötigt ebenfalls 3 Argumente und gibt diese zurück. Die Definition ist äquivalent zu:

{\ displaystyle \ lambda x. \ lambda y. \ lambda z \. \ x \ y \ z}

Bei der Anwendung der Funktion a, b und c

{\ Display \ links (\ lambda x \ Lambda y \ Lambda z \ \ X \ y \ z \ rechts…) \ A \ b \ C \ {\ mathsf {- \ Die \ anwendung}}}

{\ displaystyle \ left (\ lambda y. \ lambda z \. \ a \ y \ z \ rechts) \ b \ c}

{\ displaystyle \ left (\ lambda z \. \ a \ b \ z \ rechts) \ c}

{\ displaystyle a \ b \ c \ {\ mathsf {- \ Ergebnis}}}

Nach erstmaliger Anwendung der Funktion a , b und c wird x im Funktionskörper durch erste Argument a ersetzt. Das ist eine Ergebnis Funktion, sterben noch Argumente sterben y und z verlangt. This Wird sofort auf b und cangewendet.

Geometrics Beispiel

f (x, y) = x ^ 2 + xy + y ^ 2

Sie können die Situation für Ihre Funktion mit dem Zwei Argument finden {\ displaystyle z = f (x, y)}which follows claim: Das Fixieren einer Argumentvariable entspricht einer Einschränkung der zweidimensionalen Definitionsmenge auf einin endimensionale Teilmenge, zB{\ displaystyle y = 1}der resultierende funktionale Ausdruck der Schnittkurve des Graphen von{\ displaystyle f (x, y)} mit der Ebene aller Punkte {\ displaystyle (x, 1, z)}. Alle Punkte{\ displaystyle (x, y, z)} des Graphen könnten auch durch eine zweistufige Auswahl {\ displaystyle y = 1} und dann durch die Auswertung der Schnittkurve {\ displaystyle s (x) = f (x, y) | _ {y = 1}} an der Stelle {\ Displaystyle x}.

Anwendung

Currying wird überwiegend in Programmersprachen und Kalkülen verwirrt, in denen Funktion nur ein einzelnes Argument erhalten darf. Dazu Ohr beispielsweise ML , unlambda und das Lambda – Kalkül Sowie der nach Curry benannte Haskell . Viele dieser Sprachen bieten dem Programmierer syntaktische Möglichkeiten, die zu verschleiern sind. Ein Beispiel dafür ist die Äquivalenz der Funktionsdefinition im oben gesicht Beispiel .

In Programmierreden

JavaScript

Ihr nächstes Beispiel sieht Curry in JavaScript . Zunächst Wird Eine Funktion addiere bestimmt, sterben Einerseits als Plan Ergebnis Summe der Beiden Argumente Hass sterben, andererseits, nur mit , ideal Argument aufgerufen Einem Wird ( Teil anwendung ) Eine als Closure bestimmt zurückgibt Funktion.

Funktion addiere ( x , y ) {
 wenn ( Typeof y === "undefiniert" ) {
 return - Funktion ( yy ) {
 return x + yy ;
 }
 }
 Rück x + y ;
}
Addiars ( 2 , 4 ); // normaler Aufruf. Ergibt 6
war addiere_zu_drei = addiere ( 3 ); //
Currieren von addiere_zu_drei( 5 ); // ergibt 8
Dokument . schreibe ( addiere ( 2 , 4 ) + "<br />" )
Dokument . schreibe ( addiere_zu_drei ( 5 ) + "<br />" )

Durch Wird sterben Funktion Teil Angewandte currying, Wobei sterben Funktionsargumente nacheinander übergeben Werden und zwischenzeitlich in Einer Neuen Funktion Gehalten Werden, sterben Beliebers weiterverwendet Werden Kann.

Haskell

Das Striegeln ist in Haskell wesentlich. Jede Funktion erhält, wie oben erwähnt, nur ein Argument. Wäre scheinbar mehrere Argumente definiert, so steckt je Currying dahinter:

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

Einzelnachweise

  1. Hochspringen↑ Moses Schönfinkel : Über die Bausteine ​​der Mathematischen Logik. In: Mathematische Annalen 92 (1928). S. 305-316, Digitalisat .
  2. Hochspringen↑ Gottlob Frege : Grundgesetze der Arithmetik. Hermann Pohle, Jena 1893 (Band I) 1903 (Band II) korpora.org .
  3. Hochspringen↑ Haskell Brooks Curry , Robert Feys, Roger Hindley , Jonathan P. Seldin: Kombinatorische Logik. Nordholland, 2 Bände, 1958, 1972.