J'ai beaucoup posé cette question en apprenant et on m'a depuis posé de nombreuses fois. La façon la plus simple de décrire la différence est que les deux sont les mêmes :) Laissez-moi vous expliquer ... il y a évidemment des différences.
L'application partielle et le curry impliquent de fournir des arguments à une fonction, peut-être pas tous en même temps. Un exemple assez canonique est d'ajouter deux nombres. En pseudocode (en fait JS sans mots-clés), la fonction de base peut être la suivante:
add = (x, y) => x + y
Si je voulais une fonction "addOne", je pourrais l'appliquer partiellement ou la curry:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Maintenant, les utiliser est clair:
addOneC(2) #=> 3
addOneP(2) #=> 3
Alors quelle est la différence? Eh bien, c'est subtil, mais une application partielle implique de fournir des arguments et la fonction retournée exécutera ensuite la fonction principale lors de la prochaine invocation tandis que le curry continuera d'attendre jusqu'à ce qu'il ait tous les arguments nécessaires:
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 bref, utilisez une application partielle pour préremplir certaines valeurs, sachant que la prochaine fois que vous appellerez la méthode, elle s'exécutera, laissant non défini tous les arguments non fournis; utilisez le curry lorsque vous souhaitez renvoyer continuellement une fonction partiellement appliquée autant de fois que nécessaire pour remplir la signature de la fonction. Un dernier exemple artificiel:
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
J'espère que cela t'aides!
MISE À JOUR: Certains langages ou implémentations lib vous permettront de passer une arité (nombre total d'arguments en évaluation finale) à l'implémentation d'application partielle qui peut confondre mes deux descriptions dans un désordre déroutant ... mais à ce stade, les deux techniques sont largement interchangeable.