JavaScript咖喱功能

dhe*_*aur 13 javascript partial-application

我用curry这种方式实现了一个函数:

function curry (fn) {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments, [1]);
    return function () {
        fn.apply(null, args.concat(slice.apply(arguments)));
    };
}
Run Code Online (Sandbox Code Playgroud)

当我使用上述功能执行以下操作时

function add (x, y) {
    return x + y;
}

var inc = curry(add, 1);
console.log(inc(10));
Run Code Online (Sandbox Code Playgroud)

它记录undefined.11不是预期的产出吗?我的代码出了什么问题?

注意:console.log(x, y)add功能日志中使用1 10.我不明白为什么会回来undefined.

Chr*_*rey 13

你错过了return咖喱功能.

return function () {
    return fn.apply(null, args.concat(slice.apply(arguments)));
};
Run Code Online (Sandbox Code Playgroud)

这似乎工作:)

  • @dheerosaur - 别担心,我们都是傻瓜.:) (3认同)
  • 对此的正确用语是部分应用功能 - 不是严格限制...但仍然很好! (3认同)

Eri*_*ung 11

这是咖喱功能的一个例子:

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);
}
Run Code Online (Sandbox Code Playgroud)

这个咖喱功能创建了任何功能的咖喱版本.您可以将参数部分应用于新功能.对于每个部分应用程序,它将返回一个接受其余参数的函数.一旦应用了原始函数的所有参数,它将返回一个值.