Tuve esta pregunta mucho mientras aprendía y desde entonces me la han hecho muchas veces. La forma más simple de describir la diferencia es que ambos son iguales :) Permítanme explicar ... obviamente hay diferencias.
Tanto la aplicación parcial como el currículum implican proporcionar argumentos a una función, quizás no todos a la vez. Un ejemplo bastante canónico es sumar dos números. En pseudocódigo (en realidad JS sin palabras clave), la función base puede ser la siguiente:
add = (x, y) => x + y
Si quisiera una función "addOne", podría aplicarla parcialmente o curry:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Ahora usarlos es claro:
addOneC(2) #=> 3
addOneP(2) #=> 3
Entonces, ¿cuál es la diferencia? Bueno, es sutil, pero la aplicación parcial implica el suministro de algunos argumentos y la función devuelta ejecutará la función principal en la próxima invocación, mientras que curry seguirá esperando hasta que tenga todos los argumentos necesarios:
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
En resumen, use una aplicación parcial para rellenar algunos valores, sabiendo que la próxima vez que llame al método, se ejecutará, dejando indefinidos todos los argumentos no proporcionados; use el curry cuando desee devolver continuamente una función parcialmente aplicada tantas veces como sea necesario para cumplir con la firma de la función. Un último ejemplo artificial:
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
¡Espero que esto ayude!
ACTUALIZACIÓN: Algunos lenguajes o implementaciones lib le permitirán pasar un arity (número total de argumentos en la evaluación final) a la implementación parcial de la aplicación que puede combinar mis dos descripciones en un lío confuso ... pero en ese punto, las dos técnicas son En gran parte intercambiable.