Пока описал задачу, сам понял, как её нужно решать. ))
function add(x) {
return function(y) {
return x + y;
};
}
function sum(a) {
return function(b) {
if (b) {
return sum(add(a)(b));
} else {
return a;
}
};
}
sum(1)(2)(3)(4)(5)() === 15
function cons(x) {
return function(y) {
return [x, y];
};
}
function list(a) {
return function(b) {
if (b) {
return list(cons(a)(b));
} else {
return a;
}
};
}
list(1)(2)(3)(4)(5)() === [[[[1, 2], 3], 4], 5]
Update
Скорректированный код для второго случая, возвращающий более каноничный вид списка:
function cons(x) {
return function(y) {
return [x, y];
};
}
function list(a) {
return function(b) {
if (typeof b !== 'undefined') {
if (a instanceof Array) {
return list(cons(b)(a));
} else {
return list(cons(b)(cons(a)('NIL')));
}
} else {
return a;
}
};
}
list(1)(2)(0)(4)(5)() === [5,[4,[0,[2,[1,"NIL"]]]]]
Хотя список всё равно создаётся в обратном порядке.