【问题标题】:JavaScript curry functionJavaScript 咖喱函数
【发布时间】:2010-12-09 04:08:34
【问题描述】:

我已经以这种方式实现了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));

它记录undefined。 11 不是预期的输出吗?我的代码有什么问题?

注意:在add 函数日志1 10 中使用console.log(x, y)。我不明白为什么它返回undefined

【问题讨论】:

  • 其实不是咖喱,是偏应用。
  • 我知道我正在恢复一个非常古老的线程,但是将[1] 作为arguments 的参数应用有什么作用呢?
  • 它从参数列表中删除传递的函数!

标签: javascript partial-application


【解决方案1】:

您的 curry 函数中缺少 return

return function () {
    return fn.apply(null, args.concat(slice.apply(arguments)));
};

这似乎有效:)

【讨论】:

  • 正确的说法是函数的部分应用——不是严格的柯里化......但仍然很好!
【解决方案2】:

这是一个咖喱函数的例子:

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 版本。您可以将参数部分应用于新函数。对于每个部分应用程序,它将返回一个接受其余参数的函数。一旦应用了原始函数的所有参数,它将返回一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2022-01-02
    • 2011-04-21
    相关资源
    最近更新 更多