I've seen references to curried functions in several articles and blogs but I can't find a good explanation (or at least one that makes sense!)
24 Answers
Currying is when you break down a function that takes multiple arguments into a series of functions that each take only one argument. Here's an example in JavaScript:
function add (a, b) {
return a + b;
}
add(3, 4); // returns 7
This is a function that takes two arguments, a and b, and returns their sum. We will now curry this function:
function add (a) {
return function (b) {
return a + b;
}
}
This is a function that takes one argument, a
, and returns a function that takes another argument, b
, and that function returns their sum.
add(3)(4); // returns 7
var add3 = add(3); // returns a function
add3(4); // returns 7
- The first statement returns 7, like the
add(3, 4)
statement. - The second statement defines a new function called
add3
that will add 3 to its argument. (This is what some may call a closure.) - The third statement uses the
add3
operation to add 3 to 4, again producing 7 as a result.

- 4,284
- 2
- 29
- 57

- 77,653
- 43
- 148
- 164
-
316In a practical sense, how can I make use this concept? – Strawberry Aug 08 '13 at 18:00
-
59@Strawberry, say for instance that you have a list of numbers in a `[1, 2, 3, 4, 5]` that you wish to multiply by an arbitrary number. In Haskell, I can write `map (* 5) [1, 2, 3, 4, 5]` to multiply the whole list by `5`, and thus generating the list `[5, 10, 15, 20, 25]`. – nyson Oct 26 '13 at 16:52
-
88I understand what the map function does, but I'm not sure if I understand the point you're trying to illustrate for me. Are you saying the map function represents the concept of currying? – Strawberry Oct 26 '13 at 23:11
-
100@Strawberry The first argument to `map` must be a function that takes only 1 argument - an element from the list. Multiplication - as a mathematical concept - is a binary operation; it takes 2 arguments. However, in Haskell `*` is a curried function, similar to the second version of `add` in this answer. The result of `(* 5)` is a function that takes a single argument and multiplies it by 5, and that allows us to use it with map. – Doval Jan 17 '14 at 15:22
-
38@Strawberry The nice thing about functional languages like Standard ML or Haskell is that you can get currying "for free". You can define a multi-argument function as you would in any other language, and you automatically get a curried version of it, without having to throw in a bunch of lambdas yourself. So you can produce new functions that take less arguments from any existing function without much fuss or bother, and that makes it easy to pass them to other functions. – Doval Jan 17 '14 at 15:25
-
20I still don't quite understand why you would want to do this. – Danny Sep 23 '15 at 15:03
-
23@Strawberry probably for job interviews. ;) – lukas_o Jan 27 '16 at 10:02
-
Well thank you for the explanation, unfortunately the Scheme examples flew right over my head. – SSH This Jan 29 '16 at 21:57
-
6@SSHThis Do you know JavaScript? I edited this answer to use JS instead of Scheme. – Kyle Cronin Jan 30 '16 at 02:02
-
I'm a little late, but your code says 3+7=7. Thank you for the explanation though! – Zeek Aran Feb 05 '16 at 20:00
-
1@Danny well what is more readable and concise? `(lambda x: x + 5)`, `(\x -> x + 5)` etc. or `(+ 5)`? Because without currying you have to use the former for things like `map (+ 5) [1, 2, 3, 4, 5]`. – semicolon Mar 31 '16 at 02:12
-
4@OscarRyz That doesn't look like currying to me. If you want to go with filtering, something like `var greaterThan = x => y => y > x;` would let you curry greaterThan so that you can use it like `[1,2,3,4,5].filter(greaterThan(3))`. – Kyle Cronin Oct 02 '16 at 16:50
-
1basically its a use case of closures .. close over one or more argument to make a more specialized function . – Ahmed Eid Mar 22 '17 at 11:25
-
7it's useful for caching arguments, maybe you need to call a function many times but the first argument will be the same or maybe that first argument maintains some sort of internal state in a closure – aw04 Apr 27 '17 at 20:36
-
7Currying is useful if you find you have a function where you are pass in a parameter which never changes. (Possibly a class with lots of reusable methods?) Instead of always passing in that same parameter, you curry the function to only pass in the parameters that do change – camjocotem Jan 28 '19 at 14:08
-
consider in above answer,if you need to perform add(3,x) multiple times and your first parameter is always same (3) so you no need to call add(3,x) always. you can just call add3(4). – Abhi Sep 10 '20 at 06:41
-
1"into a series of functions that each take only one argument". I often do a currying like pattern where I create a series of functions so that the top level function is cleaner but not all my functions have just one argument. Is it still currying? – david_adler Feb 04 '21 at 13:12
-
@Strawberry what a lovely sequence of comments! Nice to see helpful advice and questions followed by answers. – cppProgrammer Aug 31 '23 at 13:17
In an algebra of functions, dealing with functions that take multiple arguments (or equivalent one argument that's an N-tuple) is somewhat inelegant -- but, as Moses Schönfinkel (and, independently, Haskell Curry) proved, it's not needed: all you need are functions that take one argument.
So how do you deal with something you'd naturally express as, say, f(x,y)
? Well, you take that as equivalent to f(x)(y)
-- f(x)
, call it g
, is a function, and you apply that function to y
. In other words, you only have functions that take one argument -- but some of those functions return other functions (which ALSO take one argument;-).
As usual, wikipedia has a nice summary entry about this, with many useful pointers (probably including ones regarding your favorite languages;-) as well as slightly more rigorous mathematical treatment.

- 854,459
- 170
- 1,222
- 1,395
-
1I suppose similar comment to mine above - I have not seen that functional languages restrict functions to taking a single arg. Am I mistaken? – Eric M Aug 30 '09 at 21:50
-
1@hoohoo: Functional languages don't generally restrict functions to a single argument. However, on a lower, more mathematical level it's a lot easier to deal with functions that only take one argument. (In lambda calculus, for example, functions only take one argument at a time.) – Sam DeFabbia-Kane Aug 30 '09 at 23:00
-
1OK. Another questions then. Is the following a true statement? Lambda calculus can be used as a model of functional programming but functional programming is not necessarily applied lambda calculus. – Eric M Aug 31 '09 at 14:59
-
8As wikipedia pages note, most FP languages "embellish" or "augment" lambda calculus (e.g. with some constants and datatypes) rather than just "applying" it, but it's not that close. BTW, what gives you the impression that e.g. Haskell DOESN'T "restrict functions to taking a single arg"? It sure does, though that's irrelevant thanks to currying; e.g. `div :: Integral a => a -> a -> a` -- note those multiple arrows? "Map a to function mapping a to a" is one reading;-). You _could_ use a (single) tuple argument for `div` &c, but that would be really anti-idiomatic in Haskell. – Alex Martelli Aug 31 '09 at 15:20
-
@Alex - wrt Haskell & arg count, I have not spent a lot of time on Haskell, and that was all a few weeks ago. So it was an easy error to make. – Eric M Aug 31 '09 at 17:03
Here's a concrete example:
Suppose you have a function that calculates the gravitational force acting on an object. If you don't know the formula, you can find it here. This function takes in the three necessary parameters as arguments.
Now, being on the earth, you only want to calculate forces for objects on this planet. In a functional language, you could pass in the mass of the earth to the function and then partially evaluate it. What you'd get back is another function that takes only two arguments and calculates the gravitational force of objects on earth. This is called currying.

- 3,232
- 3
- 23
- 27
-
3As a curiosity, the Prototype library for JavaScript offers a "curry" function that does pretty much exactly what you've explained here: http://www.prototypejs.org/api/function/curry – shuckster Aug 30 '09 at 02:26
-
New PrototypeJS curry function link. http://prototypejs.org/doc/latest/language/Function/prototype/curry/index.html – Richard Ayotte Dec 12 '12 at 16:53
-
11This sounds like partial application to me. My understanding is that if you apply currying, you can create functions with a single argument and compose them to form more complicated functions. Am I missing something? – neontapir Apr 01 '13 at 21:48
-
12@neontapir is correct. What Shea described is not currying. It is partial application. If a three-argument function is curried and you call it as f(1), what you get back is not a two-argument function. You get back a one-argument function that returns another one-argument function. A curried function can only ever be passed one argument. The curry function in PrototypeJS is also not currying. It's partial application. – MindJuice Oct 28 '15 at 05:31
-
no (to partial evaluation) and no (to currying). this is known as partial application. currying is needed to enable it. – Will Ness Aug 22 '18 at 13:29
-
It can be a way to use functions to make other functions.
In javascript:
let add = function(x){
return function(y){
return x + y
};
};
Would allow us to call it like so:
let addTen = add(10);
When this runs the 10
is passed in as x
;
let add = function(10){
return function(y){
return 10 + y
};
};
which means we are returned this function:
function(y) { return 10 + y };
So when you call
addTen();
you are really calling:
function(y) { return 10 + y };
So if you do this:
addTen(4)
it's the same as:
function(4) { return 10 + 4} // 14
So our addTen()
always adds ten to whatever we pass in. We can make similar functions in the same way:
let addTwo = add(2) // addTwo(); will add two to whatever you pass in
let addSeventy = add(70) // ... and so on...
Now the obvious follow up question is why on earth would you ever want to do that? It turns what was an eager operation x + y
into one that can be stepped through lazily, meaning we can do at least two things
1. cache expensive operations
2. achieve abstractions in the functional paradigm.
Imagine our curried function looked like this:
let doTheHardStuff = function(x) {
let z = doSomethingComputationallyExpensive(x)
return function (y){
z + y
}
}
We could call this function once, then pass around the result to be used in lots of places, meaning we only do the computationally expensive stuff once:
let finishTheJob = doTheHardStuff(10)
finishTheJob(20)
finishTheJob(30)
We can get abstractions in a similar way.

- 1,459
- 13
- 21
-
25The best step by step explanation of an inherently sequential process I've seen here, and perhaps the best, most explanatory answer of the lot. – Mar 16 '18 at 07:02
-
7@jonsilver I’d say the opposite, not a good explanation. I agree it’s good at explaining the example posed, but people tend to default to thinking, “yeah perfectly clear but I could have done the same thing another way so what good is currying?” In other words, I wish it had just enough context or explanation to illuminate not just how currying works, but also why it’s not a useless and trivial observation compared to other ways of adding ten. – whitneyland Apr 18 '18 at 23:46
-
4
-
4The curry pattern is a way of applying a fixed argument to an existing function for the purpose of creating a new reusable function without recreating the original function. This answer does an excellent job of demonstrating that. – tobius Feb 22 '21 at 16:19
-
4"we can do at least two things 1. cache expensive operations 2. achieve abstractions in the functional paradigm." This is the "why it's useful" explanation other answers lacked. And I think this answer explained the "what" excellently, too. – drkvogel Apr 10 '21 at 21:26
-
Isn't it the case that the props or arguments passed in all need to be in scope to produce the results? In our example without currying f(x,y). How does the nested function get access to y? – gwhiz Oct 06 '22 at 20:19
-
This is great because I'm doing a search query, and was wondering why curry was used. Now I know the data is doSomethingComputationallyExpensive, and the search query is doTheHardStuff. So doTheHardStuff is the search query that changes, and the data is already there, so apply it on the data which is doSomethingComputationallyExpensive. – Nhon Ha Jun 20 '23 at 01:57
Currying is a transformation that can be applied to functions to allow them to take one less argument than previously.
For example, in F# you can define a function thus:-
let f x y z = x + y + z
Here function f takes parameters x, y and z and sums them together so:-
f 1 2 3
Returns 6.
From our definition we can can therefore define the curry function for f:-
let curry f = fun x -> f x
Where 'fun x -> f x' is a lambda function equivilent to x => f(x) in C#. This function inputs the function you wish to curry and returns a function which takes a single argument and returns the specified function with the first argument set to the input argument.
Using our previous example we can obtain a curry of f thus:-
let curryf = curry f
We can then do the following:-
let f1 = curryf 1
Which provides us with a function f1 which is equivilent to f1 y z = 1 + y + z. This means we can do the following:-
f1 2 3
Which returns 6.
This process is often confused with 'partial function application' which can be defined thus:-
let papply f x = f x
Though we can extend it to more than one parameter, i.e.:-
let papply2 f x y = f x y
let papply3 f x y z = f x y z
etc.
A partial application will take the function and parameter(s) and return a function that requires one or more less parameters, and as the previous two examples show is implemented directly in the standard F# function definition so we could achieve the previous result thus:-
let f1 = f 1
f1 2 3
Which will return a result of 6.
In conclusion:-
The difference between currying and partial function application is that:-
Currying takes a function and provides a new function accepting a single argument, and returning the specified function with its first argument set to that argument. This allows us to represent functions with multiple parameters as a series of single argument functions. Example:-
let f x y z = x + y + z
let curryf = curry f
let f1 = curryf 1
let f2 = curryf 2
f1 2 3
6
f2 1 3
6
Partial function application is more direct - it takes a function and one or more arguments and returns a function with the first n arguments set to the n arguments specified. Example:-
let f x y z = x + y + z
let f1 = f 1
let f2 = f 2
f1 2 3
6
f2 1 3
6

- 9,122
- 3
- 39
- 60

- 37,275
- 36
- 106
- 124
-
So methods in C# would need to be curried before they could be partially applied? – cdmckay Jul 25 '12 at 01:43
-
"This allows us to represent functions with multiple parameters as a series of single argument functions" - perfect, that cleared it all up nicely for me. Thanks – Fuzzy Analysis Sep 13 '14 at 22:36
A curried function is a function of several arguments rewritten such that it accepts the first argument and returns a function that accepts the second argument and so on. This allows functions of several arguments to have some of their initial arguments partially applied.

- 48,105
- 13
- 171
- 274
-
7"This allows functions of several arguments to have some of their initial arguments partially applied." - why is that beneficial? – acarlon Sep 04 '13 at 23:19
-
7@acarlon Functions are often called repeatedly with one or more arguments the same. For example, if you want to `map` a function `f` over a list of lists `xss` you can do `map (map f) xss`. – J D Sep 05 '13 at 10:32
-
1Thank you, that makes sense. I did a bit more reading and it has fallen into place. – acarlon Sep 05 '13 at 11:24
-
5I think this answer gets it right in a nice concise way. The "currying" is the process of taking the function of multiple arguments and converting it into a serious of functions that each take a single argument and return a function of a single argument, or in the case of the final function, return the actual result. This can either be done for you automatically by the language, or you can call a curry() function in other languages to generate the curried version. Note that calling a curried function with a parameter is not currying. The currying already happened. – MindJuice Oct 28 '15 at 05:48
Currying means to convert a function of N arity into N functions of arity 1. The arity
of the function is the number of arguments it requires.
Here is the formal definition:
curry(f) :: (a,b,c) -> f(a) -> f(b)-> f(c)
Here is a real world example that makes sense:
You go to ATM to get some money. You swipe your card, enter pin number and make your selection and then press enter to submit the "amount" alongside the request.
here is the normal function for withdrawing money.
const withdraw=(cardInfo,pinNumber,request){
// process it
return request.amount
}
In this implementation function expects us entering all arguments at once. We were going to swipe the card, enter the pin and make the request, then function would run. If any of those steps had issue, you would find out after you enter all the arguments. With curried function, we would create higher arity, pure and simple functions. Pure functions will help us easily debug our code.
this is Atm with curried function:
const withdraw=(cardInfo)=>(pinNumber)=>(request)=>request.amount
ATM, takes the card as input and returns a function that expects pinNumber and this function returns a function that accepts the request object and after the successful process, you get the amount that you requested. Each step, if you had an error, you will easily predict what went wrong. Let's say you enter the card and got error, you know that it is either related to the card or machine but not the pin number. Or if you entered the pin and if it does not get accepted you know that you entered the pin number wrong. You will easily debug the error.
Also, each function here is reusable, so you can use the same functions in different parts of your project.

- 35,338
- 10
- 157
- 202
Currying is translating a function from callable as f(a, b, c)
into callable as f(a)(b)(c)
.
Otherwise currying is when you break down a function that takes multiple arguments into a series of functions that take part of the arguments.
Literally, currying is a transformation of functions: from one way of calling into another. In JavaScript, we usually make a wrapper to keep the original function.
Currying doesn’t call a function. It just transforms it.
Let’s make curry function that performs currying for two-argument functions. In other words, curry(f)
for two-argument f(a, b)
translates it into f(a)(b)
function curry(f) { // curry(f) does the currying transform
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// usage
function sum(a, b) {
return a + b;
}
let carriedSum = curry(sum);
alert( carriedSum(1)(2) ); // 3
As you can see, the implementation is a series of wrappers.
- The result of
curry(func)
is a wrapperfunction(a)
. - When it is called like
sum(1)
, the argument is saved in the Lexical Environment, and a new wrapper is returnedfunction(b)
. - Then
sum(1)(2)
finally callsfunction(b)
providing 2, and it passes the call to the original multi-argument sum.

- 611
- 7
- 18
Here's a toy example in Python:
>>> from functools import partial as curry
>>> # Original function taking three parameters:
>>> def display_quote(who, subject, quote):
print who, 'said regarding', subject + ':'
print '"' + quote + '"'
>>> display_quote("hoohoo", "functional languages",
"I like Erlang, not sure yet about Haskell.")
hoohoo said regarding functional languages:
"I like Erlang, not sure yet about Haskell."
>>> # Let's curry the function to get another that always quotes Alex...
>>> am_quote = curry(display_quote, "Alex Martelli")
>>> am_quote("currying", "As usual, wikipedia has a nice summary...")
Alex Martelli said regarding currying:
"As usual, wikipedia has a nice summary..."
(Just using concatenation via + to avoid distraction for non-Python programmers.)
Editing to add:
See http://docs.python.org/library/functools.html?highlight=partial#functools.partial, which also shows the partial object vs. function distinction in the way Python implements this.

- 9,122
- 3
- 39
- 60

- 11,870
- 3
- 23
- 19
-
I do not get this - you do this: >>> am_quote = curry(display_quote, "Alex Martelli") but then you do this next: >>> am_quote("currying", "As usual, wikipedia has a nice summary...") So you have a function with two args. It would seem that currying should give you three different funcs that you would compose? – Eric M Aug 30 '09 at 21:46
-
1I am using partial to curry only one parameter, producing a function with two args. If you wanted, you could further curry am_quote to create one that only quoted Alex on a particular subject. The math backgound may be focused on ending up with functions with only one parameter - but I believe fixing any number of parameters like this is commonly (if imprecisely from a math standpoint) called currying. – Anon Aug 31 '09 at 01:43
-
(btw - the '>>>' is the prompt in the Python interactive interpreter, not part of the code.) – Anon Aug 31 '09 at 02:20
-
OK thanks for the clarification about args. I know about the Python interpreter prompt, I was trying to quote the lines but it diidn't work ;-) – Eric M Aug 31 '09 at 03:49
-
After your comment, I searched and found other references, including here on SO, to the difference between "currying" and. "partial application" in response to lots of instances of the imprecise usage I'm familiar with. See for instance: http://stackoverflow.com/questions/218025/what-is-the-difference-between-currying-and-partial-application – Anon Aug 31 '09 at 04:47
-
@Anon: I just re-read your example and saw that I missed the point. The first arg to display_quote() is after currying to produce am_quote() not present in am_quote(), but the value is carried. If I decompose display_quote() by hand I can produce 3 functions that could be composed to get the same result as display_quote() without fixing the values of any args. The call am_quote = curry(display_quote, "Alex Martelli") seems to me to turn arg 1 of display_quote into a constant string. Is this part of the point of currying, or an artifact of an approach to currying? – Eric M Aug 31 '09 at 15:05
-
I think that is exactly the crux of the terminology issue. I, like numerous others out there, was using the term in a way where wiring in arguments was the whole point of currying. Others, I have learned thanks to your question ;-), would instead agree with "artifact of an approach to currying." Good to know this difference in usage exists out there. – Anon Aug 31 '09 at 17:03
-
@Anon - well it is a quite new and still somewhat strange paradigm to me, so I certainly am not ready to state a personal preference! Knowing there is a difference in usage helps in rying understand the thing. – Eric M Aug 31 '09 at 17:06
Here is the example of generic and the shortest version for function currying with n no. of params.
const add = a => b => b ? add(a + b) : a;
const add = a => b => b ? add(a + b) : a;
console.log(add(1)(2)(3)(4)());

- 109
- 3
- 6
Currying is one of the higher-order functions of Java Script.
Currying is a function of many arguments which is rewritten such that it takes the first argument and return a function which in turns uses the remaining arguments and returns the value.
Confused?
Let see an example,
function add(a,b)
{
return a+b;
}
add(5,6);
This is similar to the following currying function,
function add(a)
{
return function(b){
return a+b;
}
}
var curryAdd = add(5);
curryAdd(6);
So what does this code means?
Now read the definition again,
Currying is a function of many arguments which is rewritten such that it takes first argument and return a function which in turns uses the remaining arguments and returns the value.
Still, Confused? Let me explain in deep!
When you call this function,
var curryAdd = add(5);
It will return you a function like this,
curryAdd=function(y){return 5+y;}
So, this is called higher-order functions. Meaning, Invoking one function in turns returns another function is an exact definition for higher-order function. This is the greatest advantage for the legend, Java Script. So come back to the currying,
This line will pass the second argument to the curryAdd function.
curryAdd(6);
which in turns results,
curryAdd=function(6){return 5+6;}
// Which results in 11
Hope you understand the usage of currying here. So, Coming to the advantages,
Why Currying?
It makes use of code reusability. Less code, Less Error. You may ask how it is less code?
I can prove it with ECMA script 6 new feature arrow functions.
Yes! ECMA 6, provide us with the wonderful feature called arrow functions,
function add(a)
{
return function(b){
return a+b;
}
}
With the help of the arrow function, we can write the above function as follows,
x=>y=>x+y
Cool right?
So, Less Code and Fewer bugs!!
With the help of these higher-order function one can easily develop a bug-free code.
I challenge you!
Hope, you understood what is currying. Please feel free to comment over here if you need any clarifications.
Thanks, Have a nice day!

- 70,110
- 9
- 98
- 181

- 96
- 1
- 4
If you understand partial
you're halfway there. The idea of partial
is to preapply arguments to a function and give back a new function that wants only the remaining arguments. When this new function is called it includes the preloaded arguments along with whatever arguments were supplied to it.
In Clojure +
is a function but to make things starkly clear:
(defn add [a b] (+ a b))
You may be aware that the inc
function simply adds 1 to whatever number it's passed.
(inc 7) # => 8
Let's build it ourselves using partial
:
(def inc (partial add 1))
Here we return another function that has 1 loaded into the first argument of add
. As add
takes two arguments the new inc
function wants only the b
argument -- not 2 arguments as before since 1 has already been partially applied. Thus partial
is a tool from which to create new functions with default values presupplied. That is why in a functional language functions often order arguments from general to specific. This makes it easier to reuse such functions from which to construct other functions.
Now imagine if the language were smart enough to understand introspectively that add
wanted two arguments. When we passed it one argument, rather than balking, what if the function partially applied the argument we passed it on our behalf understanding that we probably meant to provide the other argument later? We could then define inc
without explicitly using partial
.
(def inc (add 1)) #partial is implied
This is the way some languages behave. It is exceptionally useful when one wishes to compose functions into larger transformations. This would lead one to transducers.

- 6,572
- 3
- 42
- 74
Curry can simplify your code. This is one of the main reasons to use this. Currying is a process of converting a function that accepts n arguments into n functions that accept only one argument.
The principle is to pass the arguments of the passed function, using the closure (closure) property, to store them in another function and treat it as a return value, and these functions form a chain, and the final arguments are passed in to complete the operation.
The benefit of this is that it can simplify the processing of parameters by dealing with one parameter at a time, which can also improve the flexibility and readability of the program. This also makes the program more manageable. Also dividing the code into smaller pieces would make it reuse-friendly.
For example:
function curryMinus(x)
{
return function(y)
{
return x - y;
}
}
var minus5 = curryMinus(1);
minus5(3);
minus5(5);
I can also do...
var minus7 = curryMinus(7);
minus7(3);
minus7(5);
This is very great for making complex code neat and handling of unsynchronized methods etc.

- 5,955
- 7
- 48
- 50
I found this article, and the article it references, useful, to better understand currying: http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx
As the others mentioned, it is just a way to have a one parameter function.
This is useful in that you don't have to assume how many parameters will be passed in, so you don't need a 2 parameter, 3 parameter and 4 parameter functions.

- 41,583
- 10
- 86
- 166
As all other answers currying helps to create partially applied functions. Javascript does not provide native support for automatic currying. So the examples provided above may not help in practical coding. There is some excellent example in livescript (Which essentially compiles to js) http://livescript.net/
times = (x, y) --> x * y
times 2, 3 #=> 6 (normal use works as expected)
double = times 2
double 5 #=> 10
In above example when you have given less no of arguments livescript generates new curried function for you (double)

- 79
- 7
Most of the examples in this thread are contrived (adding numbers). These are useful for illustrating the concept, but don't motivate when you might actually use currying in an app.
Here's a practical example from React, the JavaScript user interface library. Currying here illustrates the closure property.
As is typical in most user interface libraries, when the user clicks a button, a function is called to handle the event. The handler typically modifies the application's state and triggers the interface to re-render.
Lists of items are common user interface components. Each item might have an identifier associated with it (usually related to a database record). When the user clicks a button to, for example, "like" an item in the list, the handler needs to know which button was clicked.
Currying is one approach for achieving the binding between id and handler. In the code below, makeClickHandler
is a function that accepts an id and returns a handler function that has the id in its scope.
The inner function's workings aren't important for this discussion. But if you're curious, it searches through the array of items to find an item by id and increments its "likes", triggering another render by setting the state. State is immutable in React so it takes a bit more work to modify the one value than you might expect.
You can think of invoking the curried function as "stripping" off the outer function to expose an inner function ready to be called. That new inner function is the actual handler passed to React's onClick
. The outer function is a closure for the loop body to specify the id that will be in scope of a particular inner handler function.
const List = () => {
const [items, setItems] = React.useState([
{name: "foo", likes: 0},
{name: "bar", likes: 0},
{name: "baz", likes: 0},
].map(e => ({...e, id: crypto.randomUUID()})));
// .----------. outer func inner func
// | currying | | |
// `----------` V V
const makeClickHandler = (id) => (event) => {
setItems(prev => {
const i = prev.findIndex(e => e.id === id);
const cpy = {...prev[i]};
cpy.likes++;
return [
...prev.slice(0, i),
cpy,
...prev.slice(i + 1)
];
});
};
return (
<ul>
{items.map(({name, likes, id}) =>
<li key={id}>
<button
onClick={
/* strip off first function layer to get a click
handler bound to `id` and pass it to onClick */
makeClickHandler(id)
}
>
{name} ({likes} likes)
</button>
</li>
)}
</ul>
);
};
ReactDOM.createRoot(document.querySelector("#app"))
.render(<List />);
button {
font-family: monospace;
font-size: 2em;
}
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div id="app"></div>

- 44,755
- 7
- 76
- 106
A curried function is applied to multiple argument lists, instead of just one.
Here is a regular, non-curried function, which adds two Int parameters, x and y:
scala> def plainOldSum(x: Int, y: Int) = x + y
plainOldSum: (x: Int,y: Int)Int
scala> plainOldSum(1, 2)
res4: Int = 3
Here is similar function that’s curried. Instead of one list of two Int parameters, you apply this function to two lists of one Int parameter each:
scala> def curriedSum(x: Int)(y: Int) = x + y
curriedSum: (x: Int)(y: Int)Intscala> second(2)
res6: Int = 3
scala> curriedSum(1)(2)
res5: Int = 3
What’s happening here is that when you invoke curriedSum
, you actually get two traditional function invocations back to back. The first function
invocation takes a single Int parameter named x
, and returns a function
value for the second function. This second function takes the Int parameter
y
.
Here’s a function named first
that does in spirit what the first traditional
function invocation of curriedSum
would do:
scala> def first(x: Int) = (y: Int) => x + y
first: (x: Int)(Int) => Int
Applying 1 to the first function—in other words, invoking the first function and passing in 1 —yields the second function:
scala> val second = first(1)
second: (Int) => Int = <function1>
Applying 2 to the second function yields the result:
scala> second(2)
res6: Int = 3

- 17,519
- 42
- 144
- 217
An example of currying would be when having functions you only know one of the parameters at the moment:
For example:
func aFunction(str: String) {
let callback = callback(str) // signature now is `NSData -> ()`
performAsyncRequest(callback)
}
func callback(str: String, data: NSData) {
// Callback code
}
func performAsyncRequest(callback: NSData -> ()) {
// Async code that will call callback with NSData as parameter
}
Here, since you don't know the second parameter for callback when sending it to performAsyncRequest(_:)
you would have to create another lambda / closure to send that one to the function.

- 939
- 6
- 9
-
is ```func callback``` returning itself? It's being called @ ```callback(str)``` so ```let callback = callback(str)```, callback is just the return value of ```func callback``` – nikk wong Sep 04 '16 at 00:22
-
no, `func callback(_:data:)` accepts two parameters, here I only give it one, the `String`, so it is waiting for the next one (`NSData`), this is why now `let callback` is another function waiting for data to be passed in – S2dent Sep 05 '16 at 21:49
Here you can find a simple explanation of currying implementation in C#. In the comments, I have tried to show how currying can be useful:
public static class FuncExtensions {
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
return x1 => x2 => func(x1, x2);
}
}
//Usage
var add = new Func<int, int, int>((x, y) => x + y).Curry();
var func = add(1);
//Obtaining the next parameter here, calling later the func with next parameter.
//Or you can prepare some base calculations at the previous step and then
//use the result of those calculations when calling the func multiple times
//with different input parameters.
int result = func(1);

- 1,086
- 14
- 14
"Currying" is the process of taking the function of multiple arguments and converting it into a series of functions that each take a single argument and return a function of a single argument, or in the case of the final function, return the actual result.

- 5,992
- 6
- 47
- 83

- 343
- 6
- 16
The other answers have said what currying is: passing fewer arguments to a curried function than it expects is not an error, but instead returns a function that expects the rest of the arguments and returns the same result as if you had passed them all in at once.
I’ll try to motivate why it’s useful. It’s one of those tools that you never realized you needed until you do. Currying is above all a way to make your programs more expressive - you can combine operations together with less code.
For example, if you have a curried function add
, you can write the equivalent of JS x => k + x
(or Python lambda x: k + x
or Ruby { |x| k + x }
or Lisp (lambda (x) (+ k x))
or …) as just add(k)
. In Haskelll you can even use the operator: (k +)
or (+ k)
(The two forms let you curry either way for non-commutative operators: (/ 9)
is a function that divides a number by 9, which is probably the more common use case, but you also have (9 /)
for a function that divides 9 by its argument.) Besides being shorter, the curried version contains no made-up parameter name like the x
found in all the other versions. It’s not needed. You’re defining a function that adds some constant k to a number, and you don’t need to give that number a name just to talk about the function. Or even to define it. This is an example of what’s called “point-free style”. You can combine operations together given nothing but the operations themselves. You don’t have to declare anonymous functions that do nothing but apply some operation to their argument, because that’s what the operations already are.
This becomes very handy with higher-order functions when they’re defined in a currying-friendly way. For instance, a curried map(fn, list)
lets you define a mapper with just map(fn)
that can be applied it to any list later. But currying a map defined instead as map(list, fn)
just lets you define a function that will apply some other function to a constant list, which is probably less generally useful.
Currying reduces the need for things like pipes and threading. In Clojure, you might define a temperature conversion function using the threading macro ->
: (defn f2c (deg) (-> deg (- 32) (* 5) (/ 9))
. That’s cool, it reads nicely left to right (“subtract 32, multiply by 5 and divide by 9.”) and you only have to mention the parameter twice instead of once for every suboperation… but it only works because ->
is a macro that transforms the whole form syntactically before anything is evaluated. It turns into a regular nested expression behind the scenes: (/ (* (- deg 32) 5) 9)
. If the math ops were curried, you wouldn’t need a macro to combine them so nicely, as in Haskell let f2c = (subtract 32) & (* 5) & (/ 9)
. (Although it would admittedly be more idiomatic to use function composition, which reads right to left: (/ 9) . (* 5) . (subtract 32)
.)
Again, it’s hard to find good demo examples; currying is most useful in complex cases where it really helps the readability of the solution, but those take so much explanation just to get you to understand the problem that the overall lesson about currying can get lost in the noise.

- 91,912
- 16
- 138
- 175
-
1You gave a lot of examples of how but not a single good argument as to why. Care to expound on that point as it is what I think you alluded to doing at the start of your post? – SacredGeometry Nov 25 '21 at 16:29
-
It is just a language feature that you can live without. Not necessarily useful. Some people just like to add new features to language making it harder to understand achieving same result in a different way. if you need n arguments to complete , you need n arguments. The only advantage can be to reuse function with less arguments if one can be reused for another purpose. We would do it anyway. – Winter Melon Apr 12 '23 at 20:24
There is an example of "Currying in ReasonML".
let run = () => {
Js.log("Curryed function: ");
let sum = (x, y) => x + y;
Printf.printf("sum(2, 3) : %d\n", sum(2, 3));
let per2 = sum(2);
Printf.printf("per2(3) : %d\n", per2(3));
};

- 1,721
- 1
- 18
- 29
Below is one of currying example in JavaScript, here the multiply return the function which is used to multiply x by two.
const multiply = (presetConstant) => {
return (x) => {
return presetConstant * x;
};
};
const multiplyByTwo = multiply(2);
// now multiplyByTwo is like below function & due to closure property in JavaScript it will always be able to access 'presetConstant' value
// const multiplyByTwo = (x) => {
// return presetConstant * x;
// };
console.log(`multiplyByTwo(8) : ${multiplyByTwo(8)}`);
Output
multiplyByTwo(8) : 16

- 854
- 1
- 9
- 15
A smarter way of currying would be to use Function.prototype.bind
, i.e invoking bind()
on a function). That way, the function needs not to be modified as others have demonstrated.
function h(a, b) {
return a*a + b*b;
}
var a = f.bind(this, 3);
a(4) == 5*5 // true

- 11
- 3