Ich hatte diese Frage beim Lernen oft und wurde seitdem oft gestellt. Der einfachste Weg, den Unterschied zu beschreiben, ist, dass beide gleich sind :) Lassen Sie mich erklären ... es gibt offensichtlich Unterschiede.
Sowohl bei der teilweisen Anwendung als auch beim Currying werden Argumente für eine Funktion bereitgestellt, möglicherweise nicht alle auf einmal. Ein ziemlich kanonisches Beispiel ist das Hinzufügen von zwei Zahlen. Im Pseudocode (tatsächlich JS ohne Schlüsselwörter) kann die Basisfunktion die folgende sein:
add = (x, y) => x + y
Wenn ich eine "addOne" -Funktion wollte, könnte ich sie teilweise anwenden oder curry:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Jetzt ist es klar, sie zu benutzen:
addOneC(2) #=> 3
addOneP(2) #=> 3
Was ist der Unterschied? Nun, es ist subtil, aber eine teilweise Anwendung beinhaltet die Angabe einiger Argumente, und die zurückgegebene Funktion führt dann beim nächsten Aufruf die Hauptfunktion aus, während das Currying so lange wartet, bis alle erforderlichen Argumente vorhanden sind:
curriedAdd = curry(add) # notice, no args are provided
addOne = curriedAdd(1) # returns a function that can be used to provide the last argument
addOne(2) #=> returns 3, as we want
partialAdd = partial(add) # no args provided, but this still returns a function
addOne = partialAdd(1) # oops! can only use a partially applied function once, so now we're trying to add one to an undefined value (no second argument), and we get an error
Kurz gesagt, verwenden Sie eine Teilanwendung, um einige Werte vorab auszufüllen. Beachten Sie dabei, dass die Methode beim nächsten Aufruf ausgeführt wird und alle nicht bereitgestellten Argumente undefiniert bleiben. Verwenden Sie Currying, wenn Sie eine teilweise angewendete Funktion so oft wie nötig kontinuierlich zurückgeben möchten, um die Funktionssignatur zu erfüllen. Ein letztes erfundenes Beispiel:
curriedAdd = curry(add)
curriedAdd()()()()()(1)(2) # ugly and dumb, but it works
partialAdd = partial(add)
partialAdd()()()()()(1)(2) # second invocation of those 7 calls fires it off with undefined parameters
Hoffe das hilft!
UPDATE: Einige Sprachen oder lib-Implementierungen ermöglichen es Ihnen, eine Arität (Gesamtzahl der Argumente in der endgültigen Bewertung) an die teilweise Anwendungsimplementierung zu übergeben, die meine beiden Beschreibungen zu einem verwirrenden Durcheinander zusammenführen kann ... aber an diesem Punkt sind die beiden Techniken weitgehend austauschbar.