Скажем, у меня есть некоторая функция:
function g(a,b,c){ return a + b + c }
И я хотел бы превратить его в форму "карри" (в кавычках, поскольку это не совсем карри как таковое):
function h(a,b,c){
switch(true){
case (a !== undefined && b !== undefined && c !== undefined):
return a + b + c
case (a !== undefined && b !== undefined && c === undefined):
return function(c){ return a + b + c }
case (a !== undefined && b == undefined && c === undefined ):
return function(b,c){
return (c === undefined) ? function(c){ return a + b + c } : a + b + c
}
default:
return h
}
}
Вышеупомянутая форма имеет поведение частичной привязки, которое я хочу:
h(1) -> h(b,c)
h(1,2) -> h(c)
h(1,2,3) -> 6
h() -> h(a,b,c)
Теперь я хотел бы автоматизировать этот процесс в некоторой универсальной функции curry
, чтобы при любой некаррированной функции (и, возможно, ее количестве параметров) генерировалась вышеуказанная функция. Но я не совсем уверен, как это реализовать.
В качестве альтернативы, если бы следующая форма могла быть создана автоматически, это было бы также интересно:
function f(a,b,c){
return function(a){ return function(b){ return function(c){ return a + b + c }}}
}
Хотя привязка f
выглядит так:
f(1)(2)(3) = 6
так что это очень громоздко и неидиоматично, но создание вышеуказанной формы кажется мне более выполнимым.
Теперь может ли какая-либо из приведенных выше форм быть сгенерирована какой-либо функцией, если да, то как?
undefined
. Таким образом, хотя JS не проверяет во время компиляции, что список аргументов достаточно длинный, достаточно легко проверить это во время выполнения и вести себя по-разному в зависимости от того, сколько аргументов указано. - person Rory O'Kane   schedule 27.09.2013function dIsOptional(a, b, c, d) { … }
var c = curry(dIsOptional); c(1, 2, 3); // ???
- person Ry-♦   schedule 27.09.2013_.curry
из lo-dash по предложению Криса, так как в библиотеке так много полезных вещей. - person xiaolingxiao   schedule 28.09.2013