3 ms·
Order of arguments shouldn't be a fundamental problem for currying -- libraries like Functional.js allow you to curry from the left, or to curry from the right,
by jashkenas 16y ago
Order of arguments shouldn't be a fundamental problem for currying -- libraries like Functional.js allow you to curry from the left, or to curry from the right, as you desire.
However, having higher-order functions in JavaScript take their function argument in the final position is an extremely common and important pattern in JavaScript. Most libraries prefer this:
call(arg, arg, function() {
...
});
Instead of this (which hides relevant arguments far away from the actual call site):
call(function() {
...
}, arg, arg);
- steadicat 16y agoThat's a good point. However, I find it funny that you should mention another functional library as a way around the issue. Doesn't that defeat the purpose of Underscore? I have a feeling that either the authors of Underscore don't fully get functional programming, or I don't. Of course, the latter is much more likely, that's why I'm looking for someone to set me straight.
- jashkenas 16y agoFull disclosure: I'm the author. Depending on your definition, nothing in JavaScript is "fully functional programming", because then it would have to be side-effect-free, and JavaScript is very much not that language. Calling them "functional helpers" is mostly a way of distinguishing the style in which you use them, as opposed to the object-oriented versions of the same helper functions, which can be found in libraries like Prototype.js. The idea here being that you can use them in a functional style without having to extend native objects. As I mentioned above, calling "map" with the iterator as the final argument isn't a limitation here -- it's a feature. There aren't many (any) situations I've ever seen in real-world JS where you'd want to curry together a list of iterators, and then map them together across the array, all at once. And if you do want to do such a thing, you can accomplish it either like this: _.map(list, function(item) { return convert1(convert2(convert3(item))); }); Or, if you want to get fancy, take a look at "compose": http://documentcloud.github.com/underscore/#compose http://documentcloud.github.com/underscore/#compose _.map(list, _.compose(convert1, convert2, convert3));
- deleted 16y ago[deleted]