Miałem to pytanie podczas nauki i od tego czasu zadawano mi je wiele razy. Najprostszym sposobem na opisanie różnicy jest to, że oba są takie same :) Pozwólcie, że wyjaśnię ... są oczywiście różnice.
Zarówno częściowe zastosowanie, jak i curry wymagają podania argumentów funkcji, być może nie wszystkich naraz. Dość kanonicznym przykładem jest dodanie dwóch liczb. W pseudokodzie (właściwie JS bez słów kluczowych) podstawowa funkcja może być następująca:
add = (x, y) => x + y
Gdybym chciał funkcji „addOne”, mógłbym ją częściowo zastosować lub curry:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Teraz korzystanie z nich jest jasne:
addOneC(2) #=> 3
addOneP(2) #=> 3
Jaka jest różnica? Cóż, jest subtelny, ale częściowa aplikacja wymaga podania pewnych argumentów, a zwrócona funkcja wykona główną funkcję przy następnym wywołaniu, podczas gdy currying będzie czekał, aż będzie miał wszystkie niezbędne argumenty:
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
Krótko mówiąc, użyj częściowej aplikacji do uzupełnienia niektórych wartości, wiedząc, że przy następnym wywołaniu metody zostanie ona wykonana, pozostawiając niezdefiniowane wszystkie niedostarczone argumenty; używaj curry, jeśli chcesz stale zwracać częściowo zastosowaną funkcję tyle razy, ile jest to konieczne do wypełnienia podpisu funkcji. Ostatni wymyślony przykład:
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
Mam nadzieję że to pomoże!
AKTUALIZACJA: Niektóre implementacje języków lub bibliotek lib pozwolą ci przekazać arity (całkowitą liczbę argumentów w końcowej ocenie) do częściowej implementacji aplikacji, co może złączyć moje dwa opisy w mylący bałagan ... ale w tym momencie obie techniki są w dużej mierze wymienne.