Einfache Antwort
Curry: können Sie eine Funktion aufrufen, indem Sie sie in mehrere Aufrufe aufteilen und so eine Argument pro Aufruf.
Teilweise: können Sie eine Funktion aufrufen, indem Sie sie in mehrere Aufrufe aufteilen und so mehrere Argumente pro Anruf.
Einfache Hinweise
Beide ermöglichen es Ihnen, eine Funktion mit weniger Argumenten aufzurufen (oder, besser noch, sie kumulativ bereitzustellen). Eigentlich binden beide (bei jedem Aufruf) einen bestimmten Wert an bestimmte Argumente der Funktion.
Der wirkliche Unterschied zeigt sich, wenn die Funktion mehr als 2 Argumente hat.
Einfach e(c)(Probe)
(in Javascript)
Wir möchten Folgendes durchführen process
Funktion auf verschiedenen subject
s (z. B. sind unsere Themen "subject1"
y "foobar"
Zeichenketten):
function process(context, successCallback, errorCallback, subject) {...}
Warum sollten die Argumente, wie Kontext und Rückrufe, immer übergeben werden, wenn sie immer die gleichen sein werden?
Binden Sie einfach einige Werte für die Funktion:
processSubject = _.partial(process, my_context, my_success, my_error)
// assign fixed values to the first 3 arguments of the `process` function
und rufen Sie es auf Thema1 y foobar , wobei die Wiederholung der ersten 3 Argumente weggelassen wird, mit:
processSubject('subject1');
processSubject('foobar');
Gemütlich, nicht wahr?
Mit Striegeln müssen Sie stattdessen ein Argument pro Zeit übergeben
curriedProcess = _.curry(process); // make the function curry-able
processWithBoundedContext = curriedProcess(my_context);
processWithCallbacks = processWithBoundedContext(my_success)(my_error); // note: these are two sequential calls
result1 = processWithCallbacks('subject1');
// same as: process(my_context, my_success, my_error, 'subject1');
result2 = processWithCallbacks('foobar');
// same as: process(my_context, my_success, my_error, 'foobar');
Haftungsausschluss
Ich habe alle akademischen/mathematischen Erklärungen übersprungen. Weil ich sie nicht kenne. Vielleicht hat es geholfen
EDITAR:
Wie hinzugefügt von @basickarl ein weiterer leichter Unterschied in der Verwendung der beiden Funktionen (siehe Lodash für Beispiele) ist das:
partial
gibt eine vorgekochte Funktion zurück, die kann einmal mit dem/den fehlenden Argument(en) aufgerufen werden und geben das Endergebnis zurück;
- während
curry
mehrfach aufgerufen wird (für jedes Argument einmal) und gibt jedes Mal eine vorgefertigte Funktion zurück; mit Ausnahme des Aufrufs mit dem letzten Argument, der das aktuelle Ergebnis der Verarbeitung von todo die Argumente.
Mit ES6:
hier ist ein kurzes Beispiel wie unmittelbar Currying und Partial-Application in ECMAScript 6 sind.
const curriedSum = math => eng => geo => math + eng + geo;
const partialSum = math => (eng, geo) => math + eng + geo;