javascript - "Partial Function Application"在 Javascript 上下文中是用词不当吗?

标签 javascript functional-programming

我和我的一个 friend 正在讨论 Javascript 中的柯里化(Currying)和偏函数应用,关于两者是否可以实现,我们得出了截然不同的结论。我想到了 Function.prototype.curry 的实现,这是我们讨论的基础:

Function.prototype.curry = function() {
    if (!arguments.length) return this;

    var args = Array.prototype.slice.apply(arguments);
    var mmm_curry = this, args;

    return function() {
        var inner_args = Array.prototype.slice.apply(arguments);
        return mmm_curry.apply(this, args.concat(inner_args));
    }

}

使用方法如下:

var vindaloo = function(a, b) {
    return (a + b);
}

var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);

print(masala);
print(other);

在Spidermonkey中输出如下:

$ js curry.js
3
4

他的观点是,由于 Javascript function 原语本身不支持“部分函数应用”,因此将绑定(bind)到变量 karahi 的函数称为是完全错误的部分应用。他的论点是当 vindaloo 函数被柯里化(Currying)时,函数本身被完全应用并返回一个闭包,而不是“部分应用的函数”。

现在,我的观点是,虽然 Javascript 本身不在其“function”原语中提供对部分应用程序的支持(与 ML 或 Haskell 不同),但这并不意味着您不能创建语言的高阶函数,能够封装部分应用函数的概念。此外,尽管被“应用”,函数的范围仍然绑定(bind)到它返回的闭包,导致它保持“部分应用”。

哪个是正确的?

最佳答案

从技术上讲,您正在创建一个调用原始函数的全新函数。因此,如果我对部分应用函数的理解是正确的,那么这不是部分应用函数。部分应用的函数将更接近于此(请注意,这不是通用解决方案):

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC,这仍然不是部分应用的函数。但它更近了。如果您可以检查代码,那么真正的部分应用函数实际上看起来像这样:

function karahi(b) {
    return 1 + b;
};

因此,从技术上讲,您的原始方法只是返回一个绑定(bind)在闭包中的函数。我能想到的在 JavaScript 中真正部分应用函数的唯一方法是解析函数、应用更改,然后通过 eval() 运行它。

但是,您的解决方案很好地实际应用了 JavaScript 概念,因此实际上实现了目标,即使它在技术上并不准确。

关于javascript - "Partial Function Application"在 Javascript 上下文中是用词不当吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/92984/

相关文章:

javascript - 如何使用动态 ID 隐藏动态创建的 html 元素

javascript - 自定义 strip 结帐的错误处理

javascript - 如何使用 JavaScript 附加到 anchor 的 href 属性但不影响查询字符串?

javascript - 函数式 javascript 读取、异步、写入结果

java - 使用java 8供应商传递函数代码

haskell - 如何通过隐藏 'state'更改以sig类型编写没有IO的haskell函数

Javascript:如何编写将异步执行的函数?

javascript - React 组件方法在不调用的情况下调用自身?

haskell - `refold::Functor s => (a -> s a, a) -> (s b -> b) -> b` 作为通用类型之间的态射

functional-programming - 为什么函数式编程好?