的JavaScript功能咖喱
问题描述:
我实现了一个curry
功能是这样的:的JavaScript功能咖喱
function curry (fn) {
var slice = Array.prototype.slice,
args = slice.apply(arguments, [1]);
return function() {
fn.apply(null, args.concat(slice.apply(arguments)));
};
}
当我使用上述功能做以下
function add (x, y) {
return x + y;
}
var inc = curry(add, 1);
console.log(inc(10));
它记录undefined
。预期产量是不是11?我的代码有什么问题?
注:使用console.log(x, y)
里面的add
功能日志1 10
。我不明白它为什么会返回undefined
。
答
您在咖喱功能中缺少return
。
I.e.
return function() {
return fn.apply(null, args.concat(slice.apply(arguments)));
};
,似乎工作:)
答
这是咖喱函数的例子:
function curry(func) {
var initial_args = [].slice.apply(arguments, [1]);
var func_args_length = func.length;
function curried(args) {
if (args.length >= func_args_length) {
return func.apply(null, args);
}
return function() {
return curried(args.concat([].slice.apply(arguments)));
};
}
return curried(initial_args);
}
这个咖喱功能创建的任何功能的咖喱版本。您可以部分将参数应用于新功能。对于每个部分应用程序,它将返回一个采用其余参数的函数。一旦应用了原始函数的所有参数,它将返回一个值。
其实不是咖喱,它是部分应用。 – jcubic 2013-09-20 19:55:19
我知道我正在恢复一个非常旧的线程,但是将`[1]`作为参数应用于`arguments`是做什么的? – 2013-12-31 14:54:19
它从参数列表中删除传递的函数! – monoceres 2014-02-26 15:01:29