在Javascript上下文中,"部分功能应用程序"是否用词不当?

时间:2020-03-06 14:21:34  来源:igfitidea点击:

我的一个朋友和我正在讨论有关Java中的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函数原语本身不支持"部分函数应用程序",因此将绑定到变量" karahi"的函数引用为部分应用完全错误。他的论据是,当咖喱函数" vindaloo"被使用时,该函数本身被完全应用并返回一个闭包,而不是"部分应用的函数"。

现在,我的观点是,尽管Javascript本身在其"函数"原语中不提供对部分应用程序的支持(与ML或者Haskell不同),但这并不意味着我们无法创建该语言的高阶函数。能够封装部分应用功能的概念。同样,尽管被"应用",但函数的作用域仍然绑定到它返回的闭包,导致其保持"部分应用"。

哪个是正确的?

解决方案

我们应该查看Curried JavaScript Functions。我还没有完全了解他的咖喱功能,但是可能会得到回答。

编辑:不过,我同意你的评估。

我认为谈论部分功能应用程序完全可以
在JavaScript中,如果它像部分应用程序一样工作,则必须
成为一个。我们还能如何命名?

咖喱功能如何实现他的目标只是一个实现
细节。以类似的方式,我们可以在ECMAScript规范中部分应用,
但是当IE然后像我们一样实现它时,我们将拥有
没有办法找出来。

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

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

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

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

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

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

技术细节对我来说并不重要,如果语义保持不变,并且就所有意图和目的而言,该功能的作用就好像它确实是部分应用的功能一样,谁在乎呢?

我以前是学术方面的学者,但是担心这样的细节最终并没有完成真正的工作。

我个人使用MochiKit。它有一个很好的partial()函数,可以帮助创建这样的函数。我喜欢