The easiest way to see how they differ is to consider a real example. Let's assume that we have a function Add
which takes 2 numbers as input and returns a number as output, e.g. Add(7, 5)
returns 12
. In this case:
-
Partial applying the function
Add
with a value7
will give us a new function as output. That function itself takes 1 number as input and outputs a number. As such:Partial(Add, 7); // returns a function f2 as output // f2 takes 1 number as input and returns a number as output
So we can do this:
f2 = Partial(Add, 7); f2(5); // returns 12; // f2(7)(5) is just a syntactic shortcut
-
Currying the function
Add
will give us a new function as output. That function itself takes 1 number as input and outputs yet another new function. That third function then takes 1 number as input and returns a number as output. As such:Curry(Add); // returns a function f2 as output // f2 takes 1 number as input and returns a function f3 as output // i.e. f2(number) = f3 // f3 takes 1 number as input and returns a number as output // i.e. f3(number) = number
So we can do this:
f2 = Curry(Add); f3 = f2(7); f3(5); // returns 12
In other words, "currying" and "partial application" are two totally different functions. Currying takes exactly 1 input, whereas partial application takes 2 (or more) inputs.
Even though they both return a function as output, the returned functions are of totally different forms as demonstrated above.