Ho avuto questa domanda molto durante l'apprendimento e da allora mi è stata posta molte volte. Il modo più semplice di descrivere la differenza è che entrambi sono uguali :) Mi spiego ... ci sono ovviamente differenze.
Sia l'applicazione parziale che il curry implicano fornire argomenti a una funzione, forse non tutti in una volta. Un esempio abbastanza canonico è l'aggiunta di due numeri. Nello pseudocodice (in realtà JS senza parole chiave), la funzione di base può essere la seguente:
add = (x, y) => x + y
Se volessi una funzione "addOne", potrei applicarla parzialmente o curry:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Ora usarli è chiaro:
addOneC(2) #=> 3
addOneP(2) #=> 3
Quindi qual è la differenza? Bene, è sottile, ma l'applicazione parziale comporta la fornitura di alcuni argomenti e la funzione restituita eseguirà quindi la funzione principale alla successiva chiamata mentre il curry continuerà ad aspettare fino a quando non avrà tutti gli argomenti necessari:
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
In breve, utilizzare l'applicazione parziale per precompilare alcuni valori, sapendo che la prossima volta che si chiama il metodo, verrà eseguito, lasciando indefiniti tutti gli argomenti non forniti; utilizzare il curry quando si desidera restituire continuamente una funzione parzialmente applicata tutte le volte necessarie per soddisfare la firma della funzione. Un ultimo esempio inventato:
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
Spero che sia di aiuto!
AGGIORNAMENTO: Alcune lingue o implementazioni lib ti permetteranno di passare un arity (numero totale di argomenti nella valutazione finale) all'implementazione parziale dell'applicazione che potrebbe confondere le mie due descrizioni in un pasticcio confuso ... ma a quel punto, le due tecniche sono ampiamente intercambiabile.