"部分功能应用程序"在Javascript环境中是用词不当吗?

Nat*_*ies 11 javascript functional-programming

我的一个朋友和我正在讨论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));
    }

}
Run Code Online (Sandbox Code Playgroud)

使用如下:

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

其输出如下Spidermonkey:

$ js curry.js
3
4
Run Code Online (Sandbox Code Playgroud)

他的观点是,由于Javascript function原语本身不支持"部分函数应用程序",因此karahi将部分应用的绑定到变量的函数引用是完全错误的.他的论点是,当vindaloo函数被curry时,函数本身被完全应用并返回一个闭包,而不是"部分应用的函数".

现在,我的观点是,虽然Javascript本身不支持部分应用程序在其function原语(不像ML或Haskell),但这并不意味着你不能创建一个能够的语言的更高阶函数封装部分应用函数的概念.此外,尽管被"应用",函数的范围仍然绑定到它返回的闭包,导致它保持"部分应用".

哪个是对的?

Mic*_*son 4

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

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};
Run Code Online (Sandbox Code Playgroud)

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

function karahi(b) {
    return 1 + b;
};
Run Code Online (Sandbox Code Playgroud)

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

但是,您的解决方案是该概念在 JavaScript 中的良好实际应用,因此实际上可以实现目标,即使在技术上并不精确。

  • 我认为“部分应用”是一个概念上的东西,而不是一个实现上的东西。 (3认同)