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);