Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript咖喱函数_Javascript_Partial Application - Fatal编程技术网

JavaScript咖喱函数

JavaScript咖喱函数,javascript,partial-application,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))); }; } 当我使用上述函数执行以下操作时 function add

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

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));
它记录未定义的
。11不是预期的产量吗?我的代码有什么问题


注意:使用
console.log(x,y)
add
函数日志
110
中。我不明白为什么它返回
未定义的

您的curry函数中缺少一个
返回


这似乎有效:)

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

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

此curry函数创建任何函数的curry版本。可以将部分参数应用于新函数。对于每个部分应用程序,它将返回一个函数,该函数接受其余参数。一旦应用了原始函数的所有参数,它将返回一个值。

正确的术语是部分应用函数-不是严格的套用…但仍然很好!实际上不是咖喱,它是部分应用程序。我知道我正在恢复一个非常旧的线程,但是将
[1]
作为
参数应用到
参数
实现了什么?它将从参数列表中删除传递的函数!
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);
}