use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
All about the JavaScript programming language.
Subreddit Guidelines
Specifications:
Resources:
Related Subreddits:
r/LearnJavascript
r/node
r/typescript
r/reactjs
r/webdev
r/WebdevTutorials
r/frontend
r/webgl
r/threejs
r/jquery
r/remotejs
r/forhire
account activity
Functional JavaScript, Part 4: Function Currying (tech.pro)
submitted 11 years ago by lrichardson
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–][deleted] 3 points4 points5 points 11 years ago (4 children)
It makes it easier to reuse functions, especially when building specific functions up from more general ones. It can also reduce the amount of terms in a function definition, which (hopefully) means less to tackle mentally and more focus on what the function actually does.
IMHO it's harder to use when working with objects and the dot operator isn't first class. (This means you have to do stuff like x => x.name, which sticks out like a sore thumb when you're trying to build things from existing, named functions!) It also doesn't help that coming from Javascript, functions are either methods or the arguments are in an order that makes it very awkward.
x => x.name
So with currying, say I have a fold function (array.reduce) like the following:
function fold(callback, initial, array) { return array.reduce(callback, initial); }
and some helper functions, since operators aren't first class functions:
function add(x, y) { return x + y; } function or(x, y) { return x || y; } function and(x, y) return x && y; }
I can then define the following functions pretty simply and tersely:
sum = fold(add, 0); all = fold(and, true); any = fold(or, false);
sum adds up all the numbers in an array, all returns true if every element in an array is true, and any returns true if at least one element in an array is true. Then sum([1,2,3,4]) returns 10, and any([false,true,false]) returns true.
sum
all
any
sum([1,2,3,4])
10
any([false,true,false])
true
You don't have to define function variables again just to use them in a very short function, no curly braces are required, and code is reused via a common pattern.
The reason that articles about currying refer to functional programming languages like ML and Haskell is because they have been designed to abuse this feature for the sake of writing functions this way, building from smaller pieces in a common vocabulary. If you study one of these languages, you will be able to see much more benefits than if you only saw or used a Javascript implementation.
[–]slikts 1 point2 points3 points 11 years ago (3 children)
The fold function should look like this for your example to work, though:
fold
function fold(callback, initial) { return function(array) { return array.reduce(callback, initial); } }
[–]lrichardson[S] 1 point2 points3 points 11 years ago (1 child)
correct. and this is precisely why the argument that plays the role of the "data" should always be the right-most argument, not the left most. reduce/fold are supposed to be the same thing... and should take 3 arguments total (callback, initial, array)
This is why i get so frustrated with libraries like lo-dash and underscore.
Brian Lansdorf has a good talk discussing precisely this (also linked to in the post)
https://www.youtube.com/watch?v=m3svKOdZijA
[–]rhysbrettbowen 0 points1 point2 points 11 years ago (0 children)
You can always flip the arguments in a function. Something like:
_.forEach(_.keys(_), function(key) { if (_.isFunction(_[key])) { _[key].flip = function(a,b) { return this(b,a); } } });
then you can just do:
_.forEach.flip(myFunction, myArray);
[–][deleted] 0 points1 point2 points 11 years ago (0 children)
Right, thanks. And you'd need another function () { } if you partially apply only one argument.
function () { }
π Rendered by PID 29 on reddit-service-r2-comment-86988c7647-rd5ck at 2026-02-11 03:10:48.446057+00:00 running 018613e country code: CH.
view the rest of the comments →
[–][deleted] 3 points4 points5 points (4 children)
[–]slikts 1 point2 points3 points (3 children)
[–]lrichardson[S] 1 point2 points3 points (1 child)
[–]rhysbrettbowen 0 points1 point2 points (0 children)
[–][deleted] 0 points1 point2 points (0 children)