Ich habe gesehen, Verweise auf Curry-Funktionen in mehreren Artikeln und blogs, aber ich kann nicht finden, eine gute Erklärung (oder zumindest eine, die Sinn macht!)
Currying ist, wenn Sie brechen eine Funktion mit mehreren Argumenten in eine Reihe von Funktionen, die einen Teil der Argumente. Hier ein Beispiel in JavaScript:
function add (a, b){return a + b;}
add(3,4);//returns 7
Dies ist eine Funktion, die zwei Argumente a und b und gibt deren Summe. Wir werden jetzt curry diese Funktion:
function add (a){returnfunction(b){return a + b;}}
Dies ist eine Funktion, die ein argument ein, und gibt eine Funktion, ein weiteres argument -, b -, und-Funktion liefert Ihre Summe.
add(3)(4);var add3 = add(3);
add3(4);
Gibt die erste Anweisung 7, wie die add(3, 4) - Anweisung. Die zweite Anweisung definiert eine neue Funktion namens add3, hinzufügen 3 zu Ihrer argument. Dies ist, was einige Leute nennen darf, einen Verschluss. Die Dritte Anweisung verwendet die add3-Vorgang durch, um 3, um 4 wieder Herstellung von 7 als Ergebnis.
In eine algebra von Funktionen, Umgang mit Funktionen, die mehrere Argumente (oder äquivalent ein argument, das ein N-Tupel) ist etwas unelegant-aber, wie Moses Schönfinkel (und, unabhängig von Haskell Curry) bewiesen, es ist nicht nötig: alles, was Sie brauchen, sind Funktionen, die ein argument.
So, wie Sie mit etwas umgehen würden Sie natürlich auszudrücken, als, sagen wir, f(x,y)? Gut, Sie nehmen das als äquivalent zu f(x)(y) -- f(x) nennen es g ist eine Funktion, und wenden Sie diese Funktion, um y. In anderen Worten, müssen Sie nur die Funktionen, die ein argument-aber einige, die diese Funktionen zurückgeben, die anderen Funktionen (was AUCH ein argument;-).
Als üblich, wikipedia hat eine schöne Zusammenfassung-Eintrag zu dieser, mit vielen nützliche Hinweise (und wahrscheinlich auch diejenigen in Bezug auf Ihre Lieblings-Sprachen;-) sowie etwas mehr strenge mathematische Behandlung.
Angenommen, Sie haben eine Funktion, die berechnet die gravitative Kraft auf ein Objekt. Wenn Sie nicht wissen, die Formel, können Sie finden es hier. Diese Funktion nimmt in der drei notwendigen Parameter, die als Argumente.
Nun, auf der Erde, Sie wollen nur die Berechnung von Kräften für die Objekte auf diesem Planeten. In einer funktionalen Sprache, die Sie nicht passieren konnten, in die Masse der Erde um die Funktion und dann teilweise auswerten. Was würde Sie zurück bekommen, ist eine weitere Funktion, die dauert nur zwei Argumente und berechnet die Gravitationskraft der Objekte auf der Erde. Dies nennt man currying.
Currying ist eine transformation, die angewendet werden können, um Funktionen zu ermöglichen, nehmen Sie weniger ein argument als zuvor.
Zum Beispiel in F# können Sie eine Funktion definieren, damit:-
let f x y z = x + y + z
Hier die Funktion f nimmt die Parameter x, y und z und addiert Sie zusammen, so dass:-
f 1 2 3
Zurück 6.
Unsere definition wir definieren daher die curry-Funktion für f:-
let curry f = fun x -> f x
Wo 'fun-x -> f x' ist eine lambda-Funktion äquivalent zu x => f(x) in C#. Diese Funktion Eingänge die Funktion, die Sie möchten, curry und gibt eine Funktion, die übernimmt ein einzelnes argument, und gibt die angegebene Funktion mit dem ersten argument legen Sie die input-argument.
Mit unserem vorherigen Beispiel wir erhalten ein curry von f so:-
let curryf = curry f
Wir können dann Folgendes tun:-
let f1 = curryf 1
Sodass wir nun eine Funktion f1, die ist äquivalent zu f1 y z = 1 + y + z. Dies bedeutet, dass wir Folgendes tun können:-
f1 2 3
Gibt 6.
Dieser Prozess wird oft verwechselt mit 'partial function application", die werden so definiert:-
let papply f x = f x
Aber wir können erweitern, um mehr als einen parameter, d.h.:-
let papply2 f x y = f x y
let papply3 f x y z = f x y z
etc.
Einer teilweisen Anwendung wird die Funktion und die parameter(s) und zurück, eine Funktion, die erfordert, dass Sie einen oder mehr weniger Parameter, und wie die beiden vorangegangenen Beispiele zeigen, ist direkt implementiert in der standard-F# definition einer Funktion, so das wir erreichen konnten, das bisherige Ergebnis so:-
let f1 = f 1
f1 2 3
Wird wieder ein Ergebnis von 6.
Fazit:-
Den Unterschied zwischen currying und partielle Funktion Anwendung ist, dass:-
Currying nimmt eine Funktion und eine neue Funktion akzeptiert ein einzelnes argument, und für die Rückgabe der Funktion mit dem ersten argument festgelegt, dass argument. Dies ermöglicht es uns, stellen Funktionen mit mehreren Parametern aus einer Reihe von single-argument-Funktionen. Beispiel:-
let f x y z = x + y + z
let curryf = curry f
let f1 = curryf 1
let f2 = curryf 2
f1 2 3
6
f2 1 3
6
Partielle Funktion Anwendung ist direkter, es dauert eine Funktion und ein oder mehrere Argumente und gibt eine Funktion mit der ersten n Argumente gesetzt, um die n Argumente angegeben werden. Beispiel:-
let f x y z = x + y + z
let f1 = f 1
let f2 = f 2
f1 2 3
6
f2 1 3
6
Einer Curry-Funktion ist eine Funktion von mehreren Argumenten umgeschrieben, so dass es akzeptiert das erste argument und gibt eine Funktion, übernimmt das zweite argument, und so weiter. Dies ermöglicht Funktionen, die mehrere Argumente haben, um einige Ihrer ursprünglichen Argumenten teilweise angewendet.
>>> from functools import partial as curry
>>> # Original function taking three parameters:
>>> def display_quote(who, subject, quote):
print who, 'said regarding', subject + ':'
print '"' + quote + '"'
>>> display_quote("hoohoo", "functional languages",
"I like Erlang, not sure yet about Haskell.")
hoohoo said regarding functional languages:
"I like Erlang, not sure yet about Haskell."
>>> # Let's curry the function to get another that always quotes Alex...
>>> am_quote = curry(display_quote, "Alex Martelli")
>>> am_quote("currying", "As usual, wikipedia has a nice summary...")
Alex Martelli said regarding currying:
"As usual, wikipedia has a nice summary..."
(Nur mit Verkettung mit+, um Ablenkung zu vermeiden, die für nicht-Python-Programmierer.)
Als die anderen erwähnt, es ist nur ein Weg, um eine ein-parameter-Funktion.
Dies ist sinnvoll, da Sie nicht davon ausgehen, wie viele Parameter übergeben werden, so dass Sie nicht brauchen eine 2 parameter, 3 parameter-und 4-parameter-Funktionen.
Wenn Sie verstehen partial du bist auf halbem Weg gibt. Die Idee partial ist preapply Argumente einer Funktion und wieder eine neue Funktion, die will nur die restlichen Argumente. Wenn diese neue Funktion wird aufgerufen, es umfasst die vorinstallierte Argumente zusammen mit was auch immer für Argumente geliefert wurden.
Clojure + ist eine Funktion, aber um die Dinge ganz klar:
(defn add [a b] (+ a b))
Können Sie sich bewusst sein, dass die inc Funktion einfach 1 addiert, um die Zahl, es ist vorbei.
(inc 7) # => 8
Bauen wir es uns mit partial:
(def inc (partial add 1))
Hier werden wir wieder eine andere Funktion, hat 1 geladen das erste argument add. Als add nimmt zwei Argumente, die die neue inc Funktion will nur die b argument -- keine 2 Argumente, die nach wie vor seit 1 bereits teilweise angewendet. So partial ist ein Werkzeug, das zum erstellen neuer Funktionen mit default-Werten presupplied. Das ist, warum in eine funktionale Sprache, die Funktionen oft um Argumente vom Allgemeinen zum speziellen. Dies macht es einfacher zu verwenden, solche Funktionen zu konstruieren, die anderen Funktionen.
Nun stellen Sie sich vor, wenn die Sprache, die klug genug waren zu verstehen, introspektiv, dass add wollte zwei Argumente. Wenn wir es übergeben ein argument, eher als balking, was ist, wenn die Funktion teilweise angewendet, das argument, Gaben wir es auf unseren Auftrag verstehen wir, dass wir wahrscheinlich gedacht, um die andere argument später? Dann könnten wir definieren inc ohne explizit mit partial.
(def inc (add 1)) #partial is implied
Dies ist der Weg einige Sprachen Verhalten. Es ist besonders nützlich, wenn man will, zu Komponieren Funktionen in größere Transformationen. Dies würde dazu führen, zu Aufnehmern.
Einer Curry-Funktion angewandt wird, um mehrere Argumente, anstatt nur
ein.
Hier ist eine regelmäßige, nicht-Curry-Funktion, wodurch zwei Int
Parameter x und y:
scala> def plainOldSum(x: Int, y: Int) = x + y
plainOldSum: (x: Int,y: Int)Int
scala> plainOldSum(1, 2)
res4: Int = 3
Hier ähnliche Funktion, die die Curry. Statt
eine Liste von zwei Int-Parameter, können Sie die Anwendung dieser Funktion auf zwei Listen ein
Int-parameter:
scala> def curriedSum(x: Int)(y: Int) = x + y
curriedSum: (x: Int)(y: Int)Intscala> second(2)
res6: Int = 3
scala> curriedSum(1)(2)
res5: Int = 3
Was hier passiert ist, dass beim aufrufen curriedSumerhalten Sie tatsächlich zwei traditionelle Funktion Aufrufe, Rücken an Rücken. Die erste Funktion
Aufruf mit einem einzigen Int-parameter namens x aus und liefert eine Funktion
Wert für die zweite Funktion. Diese zweite Funktion nimmt den Int-parameter y.
Hier ist eine Funktion namens firstdie nicht im Geist ist, was der erste traditionelle
Funktions-Aufruf von curriedSum tun würde:
scala> def first(x: Int) = (y: Int) => x + y
first: (x: Int)(Int) => Int
Anwendung 1 um die erste Funktion—in anderen Worten, aufrufen der ersten Funktion
und die übergabe in 1 —ergibt sich die zweite Funktion:
scala> val second = first(1)
second: (Int) => Int = <function1>
Anwendung von 2 um die zweite Funktion liefert das Ergebnis:
Beispiel currying wäre, wenn man Funktionen, die Sie nur wissen, dass einer der Parameter im moment:
Beispiel:
func aFunction(str: String) {
let callback = callback(str) //signature now is `NSData -> ()`
performAsyncRequest(callback)
}
func callback(str: String, data: NSData) {
//Callback code
}
func performAsyncRequest(callback: NSData -> ()) {
//Async code that will call callback with NSData as parameter
}
Hier, da Sie nicht wissen, den zweiten parameter für die callback-beim Versand an performAsyncRequest(_:) Sie müsste dann eine andere lambda /closure zu senden, dass man zu der Funktion.
Geben, eine Reale Welt (und potentiell nützlich) Beispiel currying überprüfen Sie heraus, wie Sie server-Aufrufe in javascript mit der Bibliothek Holen
Get(url) {
let fullUrl = toFullUrl(url);
let promise = getPromiseForFetchWithToken((token) => {
let headers = Object.assign(
getDefaultHeaders(token),
jsonHeaders);
let config = {
method: "GET",
headers: headers
};
return fetch(fullUrl, config);
});
return promise;
}
Wo getPromiseForFetchWithToken ist eine Curry-Funktion zurückgibt, die ein Promise mit dem Ergebnis der fetch -, wie unten gezeigt:
function getPromiseForFetchWithToken(tokenConsumingFetch) {
function resolver(resolve, reject) {
let token = localStorage.getItem("token");
tokenConsumingFetch(token)
.then(checkForError)
.then((response) => {
if (response) resolve(response);
})
.catch(reject);
}
var promise = new Promise(resolver);
return promise;
}
Diese können Sie erwarten den Anruf der Get Funktion und dann entsprechend verarbeiten den Rückgabewert egal was es ist, Sie wieder verwenden können die getPromiseForFetchWithToken - Funktion überall Sie brauchen, um einen server aufrufen, muss ein bearer-token. (Put, Delete, Post, etc)
Als alle anderen Antworten currying hilft zu schaffen, teilweise angewandte Funktionen. Javascript keine native Unterstützung für automatisches currying. Also die Beispiele, die oben können nicht helfen, in die praktische Kodierung. Es gibt einige ausgezeichnete Beispiel in livescript (Die im wesentlichen kompiliert js) http://livescript.net/
times = (x, y) --> x * y
times 2, 3 #=> 6 (normal use works as expected)
double = times 2
double 5 #=> 10
Im obigen Beispiel, wenn Sie weniger keine Argumente livescript erzeugt neue Curry-Funktion für Sie (Doppel -)
Curry kann den code vereinfachen. Dies ist einer der Hauptgründe für die Verwendung dieser. Currying ist ein Prozess der Umwandlung eine Funktion, die nimmt n Argumente in die n Funktionen, die akzeptiert nur ein argument.
Dem Prinzip der übergabe von Argumenten an die Funktion übergeben, mit der Schließung (closure) - Eigenschaft, um Sie zu speichern in einer anderen Funktion und behandeln es als einen Rückgabewert, und diese Funktionen bilden eine Kette, und die letzten Argumente übergeben werden, um den Vorgang abzuschließen.
Der Vorteil dabei ist, dass es vereinfacht die Verarbeitung von Parametern durch den Umgang mit einem parameter in einer Zeit, die auch zur Verbesserung der Flexibilität und Lesbarkeit des Programms. Das macht das Programm übersichtlicher. Auch die Aufteilung der code in kleinere Stücke würde es wiederzuverwenden-freundlich.
Beispiel:
function curryMinus(x)
{
return function(y)
{
return x - y;
}
}
var minus5 = curryMinus(1);
minus5(3);
minus5(5);
Kann ich auch tun...
var minus7 = curryMinus(7);
minus7(3);
minus7(5);
Dieser ist sehr groß für die Herstellung von komplexen code, der ordentlich und die Handhabung von nicht synchronisierte Methoden etc.
Currying ist, wenn Sie brechen eine Funktion mit mehreren Argumenten in eine Reihe von Funktionen, die einen Teil der Argumente. Hier ein Beispiel in JavaScript:
Dies ist eine Funktion, die zwei Argumente a und b und gibt deren Summe. Wir werden jetzt curry diese Funktion:
Dies ist eine Funktion, die ein argument ein, und gibt eine Funktion, ein weiteres argument -, b -, und-Funktion liefert Ihre Summe.
Gibt die erste Anweisung 7, wie die add(3, 4) - Anweisung. Die zweite Anweisung definiert eine neue Funktion namens add3, hinzufügen 3 zu Ihrer argument. Dies ist, was einige Leute nennen darf, einen Verschluss. Die Dritte Anweisung verwendet die add3-Vorgang durch, um 3, um 4 wieder Herstellung von 7 als Ergebnis.
InformationsquelleAutor der Antwort Kyle Cronin
In eine algebra von Funktionen, Umgang mit Funktionen, die mehrere Argumente (oder äquivalent ein argument, das ein N-Tupel) ist etwas unelegant-aber, wie Moses Schönfinkel (und, unabhängig von Haskell Curry) bewiesen, es ist nicht nötig: alles, was Sie brauchen, sind Funktionen, die ein argument.
So, wie Sie mit etwas umgehen würden Sie natürlich auszudrücken, als, sagen wir,
f(x,y)
? Gut, Sie nehmen das als äquivalent zuf(x)(y)
--f(x)
nennen esg
ist eine Funktion, und wenden Sie diese Funktion, umy
. In anderen Worten, müssen Sie nur die Funktionen, die ein argument-aber einige, die diese Funktionen zurückgeben, die anderen Funktionen (was AUCH ein argument;-).Als üblich, wikipedia hat eine schöne Zusammenfassung-Eintrag zu dieser, mit vielen nützliche Hinweise (und wahrscheinlich auch diejenigen in Bezug auf Ihre Lieblings-Sprachen;-) sowie etwas mehr strenge mathematische Behandlung.
InformationsquelleAutor der Antwort Alex Martelli
Hier ein konkretes Beispiel:
Angenommen, Sie haben eine Funktion, die berechnet die gravitative Kraft auf ein Objekt. Wenn Sie nicht wissen, die Formel, können Sie finden es hier. Diese Funktion nimmt in der drei notwendigen Parameter, die als Argumente.
Nun, auf der Erde, Sie wollen nur die Berechnung von Kräften für die Objekte auf diesem Planeten. In einer funktionalen Sprache, die Sie nicht passieren konnten, in die Masse der Erde um die Funktion und dann teilweise auswerten. Was würde Sie zurück bekommen, ist eine weitere Funktion, die dauert nur zwei Argumente und berechnet die Gravitationskraft der Objekte auf der Erde. Dies nennt man currying.
InformationsquelleAutor der Antwort Shea Daniels
Currying ist eine transformation, die angewendet werden können, um Funktionen zu ermöglichen, nehmen Sie weniger ein argument als zuvor.
Zum Beispiel in F# können Sie eine Funktion definieren, damit:-
Hier die Funktion f nimmt die Parameter x, y und z und addiert Sie zusammen, so dass:-
Zurück 6.
Unsere definition wir definieren daher die curry-Funktion für f:-
Wo 'fun-x -> f x' ist eine lambda-Funktion äquivalent zu x => f(x) in C#. Diese Funktion Eingänge die Funktion, die Sie möchten, curry und gibt eine Funktion, die übernimmt ein einzelnes argument, und gibt die angegebene Funktion mit dem ersten argument legen Sie die input-argument.
Mit unserem vorherigen Beispiel wir erhalten ein curry von f so:-
Wir können dann Folgendes tun:-
Sodass wir nun eine Funktion f1, die ist äquivalent zu f1 y z = 1 + y + z. Dies bedeutet, dass wir Folgendes tun können:-
Gibt 6.
Dieser Prozess wird oft verwechselt mit 'partial function application", die werden so definiert:-
Aber wir können erweitern, um mehr als einen parameter, d.h.:-
Einer teilweisen Anwendung wird die Funktion und die parameter(s) und zurück, eine Funktion, die erfordert, dass Sie einen oder mehr weniger Parameter, und wie die beiden vorangegangenen Beispiele zeigen, ist direkt implementiert in der standard-F# definition einer Funktion, so das wir erreichen konnten, das bisherige Ergebnis so:-
Wird wieder ein Ergebnis von 6.
Fazit:-
Den Unterschied zwischen currying und partielle Funktion Anwendung ist, dass:-
Currying nimmt eine Funktion und eine neue Funktion akzeptiert ein einzelnes argument, und für die Rückgabe der Funktion mit dem ersten argument festgelegt, dass argument. Dies ermöglicht es uns, stellen Funktionen mit mehreren Parametern aus einer Reihe von single-argument-Funktionen. Beispiel:-
Partielle Funktion Anwendung ist direkter, es dauert eine Funktion und ein oder mehrere Argumente und gibt eine Funktion mit der ersten n Argumente gesetzt, um die n Argumente angegeben werden. Beispiel:-
InformationsquelleAutor der Antwort ljs
Einer Curry-Funktion ist eine Funktion von mehreren Argumenten umgeschrieben, so dass es akzeptiert das erste argument und gibt eine Funktion, übernimmt das zweite argument, und so weiter. Dies ermöglicht Funktionen, die mehrere Argumente haben, um einige Ihrer ursprünglichen Argumenten teilweise angewendet.
InformationsquelleAutor der Antwort Jon Harrop
Kann es ein Weg sein, um die Funktionen nutzen, um andere Funktionen.
In javascript:
Uns erlauben würde, es zu nennen wie so:
Wenn diese läuft die
10
übergeben wird, alsx
;das heißt, wir werden zurückgegeben dieser Funktion:
Also, wenn Sie rufen
sind Sie wirklich anrufen:
Also, wenn Sie dies tun:
es ist das gleiche wie:
Also unsere
addTen()
fügt immer zehn auf das, was wir in übergeben. Wir können ähnliche Funktionen in der gleichen Weise:InformationsquelleAutor der Antwort Adzz
Hier ist ein Spielzeug-Beispiel in Python:
(Nur mit Verkettung mit+, um Ablenkung zu vermeiden, die für nicht-Python-Programmierer.)
Bearbeiten hinzufügen:
Sehen http://docs.python.org/library/functools.html?highlight=partial#functools.partial
das zeigt auch die partielle Objekt vs. Funktion Unterscheidung in der Art Python implementiert diese.
InformationsquelleAutor der Antwort Anon
Ich fand diesen Artikel, und der Artikel, auf den es verweist, nützlich, um besser zu verstehen, currying:
http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx
Als die anderen erwähnt, es ist nur ein Weg, um eine ein-parameter-Funktion.
Dies ist sinnvoll, da Sie nicht davon ausgehen, wie viele Parameter übergeben werden, so dass Sie nicht brauchen eine 2 parameter, 3 parameter-und 4-parameter-Funktionen.
InformationsquelleAutor der Antwort James Black
Wenn Sie verstehen
partial
du bist auf halbem Weg gibt. Die Ideepartial
ist preapply Argumente einer Funktion und wieder eine neue Funktion, die will nur die restlichen Argumente. Wenn diese neue Funktion wird aufgerufen, es umfasst die vorinstallierte Argumente zusammen mit was auch immer für Argumente geliefert wurden.Clojure
+
ist eine Funktion, aber um die Dinge ganz klar:Können Sie sich bewusst sein, dass die
inc
Funktion einfach 1 addiert, um die Zahl, es ist vorbei.Bauen wir es uns mit
partial
:Hier werden wir wieder eine andere Funktion, hat 1 geladen das erste argument
add
. Alsadd
nimmt zwei Argumente, die die neueinc
Funktion will nur dieb
argument -- keine 2 Argumente, die nach wie vor seit 1 bereits teilweise angewendet. Sopartial
ist ein Werkzeug, das zum erstellen neuer Funktionen mit default-Werten presupplied. Das ist, warum in eine funktionale Sprache, die Funktionen oft um Argumente vom Allgemeinen zum speziellen. Dies macht es einfacher zu verwenden, solche Funktionen zu konstruieren, die anderen Funktionen.Nun stellen Sie sich vor, wenn die Sprache, die klug genug waren zu verstehen, introspektiv, dass
add
wollte zwei Argumente. Wenn wir es übergeben ein argument, eher als balking, was ist, wenn die Funktion teilweise angewendet, das argument, Gaben wir es auf unseren Auftrag verstehen wir, dass wir wahrscheinlich gedacht, um die andere argument später? Dann könnten wir definiereninc
ohne explizit mitpartial
.Dies ist der Weg einige Sprachen Verhalten. Es ist besonders nützlich, wenn man will, zu Komponieren Funktionen in größere Transformationen. Dies würde dazu führen, zu Aufnehmern.
InformationsquelleAutor der Antwort Mario
Einer Curry-Funktion angewandt wird, um mehrere Argumente, anstatt nur
ein.
Hier ist eine regelmäßige, nicht-Curry-Funktion, wodurch zwei Int
Parameter x und y:
Hier ähnliche Funktion, die die Curry. Statt
eine Liste von zwei Int-Parameter, können Sie die Anwendung dieser Funktion auf zwei Listen ein
Int-parameter:
Was hier passiert ist, dass beim aufrufen
curriedSum
erhalten Sie tatsächlich zwei traditionelle Funktion Aufrufe, Rücken an Rücken. Die erste FunktionAufruf mit einem einzigen Int-parameter namens
x
aus und liefert eine FunktionWert für die zweite Funktion. Diese zweite Funktion nimmt den Int-parameter
y
.Hier ist eine Funktion namens
first
die nicht im Geist ist, was der erste traditionelleFunktions-Aufruf von
curriedSum
tun würde:Anwendung 1 um die erste Funktion—in anderen Worten, aufrufen der ersten Funktion
und die übergabe in 1 —ergibt sich die zweite Funktion:
Anwendung von 2 um die zweite Funktion liefert das Ergebnis:
InformationsquelleAutor der Antwort nazar_art
Beispiel currying wäre, wenn man Funktionen, die Sie nur wissen, dass einer der Parameter im moment:
Beispiel:
Hier, da Sie nicht wissen, den zweiten parameter für die callback-beim Versand an
performAsyncRequest(_:)
Sie müsste dann eine andere lambda /closure zu senden, dass man zu der Funktion.InformationsquelleAutor der Antwort S2dent
Geben, eine Reale Welt (und potentiell nützlich) Beispiel currying überprüfen Sie heraus, wie Sie server-Aufrufe in javascript mit der Bibliothek Holen
Wo
getPromiseForFetchWithToken
ist eine Curry-Funktion zurückgibt, die einPromise
mit dem Ergebnis der fetch -, wie unten gezeigt:Diese können Sie erwarten den Anruf der
Get
Funktion und dann entsprechend verarbeiten den Rückgabewert egal was es ist, Sie wieder verwenden können diegetPromiseForFetchWithToken
- Funktion überall Sie brauchen, um einen server aufrufen, muss ein bearer-token. (Put, Delete, Post, etc)InformationsquelleAutor der Antwort Josh Siegl
Als alle anderen Antworten currying hilft zu schaffen, teilweise angewandte Funktionen. Javascript keine native Unterstützung für automatisches currying. Also die Beispiele, die oben können nicht helfen, in die praktische Kodierung. Es gibt einige ausgezeichnete Beispiel in livescript (Die im wesentlichen kompiliert js)
http://livescript.net/
Im obigen Beispiel, wenn Sie weniger keine Argumente livescript erzeugt neue Curry-Funktion für Sie (Doppel -)
InformationsquelleAutor der Antwort user3804449
Curry kann den code vereinfachen. Dies ist einer der Hauptgründe für die Verwendung dieser. Currying ist ein Prozess der Umwandlung eine Funktion, die nimmt n Argumente in die n Funktionen, die akzeptiert nur ein argument.
Dem Prinzip der übergabe von Argumenten an die Funktion übergeben, mit der Schließung (closure) - Eigenschaft, um Sie zu speichern in einer anderen Funktion und behandeln es als einen Rückgabewert, und diese Funktionen bilden eine Kette, und die letzten Argumente übergeben werden, um den Vorgang abzuschließen.
Der Vorteil dabei ist, dass es vereinfacht die Verarbeitung von Parametern durch den Umgang mit einem parameter in einer Zeit, die auch zur Verbesserung der Flexibilität und Lesbarkeit des Programms. Das macht das Programm übersichtlicher. Auch die Aufteilung der code in kleinere Stücke würde es wiederzuverwenden-freundlich.
Beispiel:
Kann ich auch tun...
Dieser ist sehr groß für die Herstellung von komplexen code, der ordentlich und die Handhabung von nicht synchronisierte Methoden etc.
InformationsquelleAutor der Antwort Marcus Thornton