У мене це питання було багато під час навчання, і з тих пір його задавали багато разів. Найпростіший спосіб я описати різницю - це те, що обидва однакові :) Дозвольте пояснити ... очевидно є відмінності.
Як часткове застосування, так і використання каррі передбачає надання аргументів функції, можливо, не все відразу. Досить канонічним прикладом є додавання двох чисел. У псевдокоді (фактично JS без ключових слів) базовою функцією може бути така:
add = (x, y) => x + y
Якби я хотів функцію "addOne", я міг би частково застосувати її або зависнути:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Тепер з їх використанням зрозуміло:
addOneC(2) #=> 3
addOneP(2) #=> 3
То яка різниця? Ну, це тонко, але часткове застосування передбачає подання деяких аргументів, і повернута функція буде виконувати головну функцію при наступному виклику, тоді як currying буде чекати, поки у неї з’являться всі необхідні аргументи:
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
Коротше кажучи, використовуйте часткове додаток для попереднього заповнення деяких значень, знаючи, що наступного разу, коли ви зателефонуєте методу, він виконає, залишаючи невизначеними всі незабезпечені аргументи; використовуйте currying, коли потрібно постійно повертати частково застосовану функцію стільки разів, скільки потрібно для виконання підпису функції. Один остаточний надуманий приклад:
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
Сподіваюся, це допомагає!
ОНОВЛЕННЯ: Деякі мови чи реалізація lib дозволять вам передати сукупність (загальну кількість аргументів у підсумковій оцінці) до часткової реалізації програми, яка може зв'язати два мої описи в заплутаному безладі ... але в цей момент ці дві методи багато в чому взаємозамінні.