Currying Javascript functions

Aqui está um snippet de código que oferece a capacidade de curry qualquer função Javascript:

 Function.prototype.curry = function () {
var fn = this,
args
= Array.prototype.slice.call(arguments, 0);
if (fn.length === args.length) {
return fn.apply(undefined, args);
}
return function (arg) {
return Function.prototype.curry.apply(fn, args.concat([arg]));
};
};

Isso permite que você faça algo como:

var add = function (x, y) { return x + y; };
var add2 = add.curry()(2);
add2
(3); // equivalent to add(2, 3) == 5

Isso também funcionará para funções com mais de 2 argumentos, é claro:

var f = function (a, b, c, d) { ... };

f
(a, b, c, d) == f.curry()(a)(b)(c)(d) == f.curry(a, b)(c)(d);