【问题标题】:Is "Partial Function Application" a misnomer in the context of Javascript?“部分函数应用程序”在 Javascript 的上下文中是用词不当吗?
【发布时间】:2010-09-10 17:10:26
【问题描述】:

我的一个朋友和我正在讨论 Javascript 中的柯里化和部分函数应用程序,对于两者是否可以实现,我们得出了截然不同的结论。我想出了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 原语本身并不支持“部分函数应用”,因此将绑定到变量 karahi 的函数称为部分应用是完全错误的。他的论点是,当 vindaloo 函数被柯里化时,函数本身被完全应用并返回一个闭包,而不是“部分应用的函数”。

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

哪个是正确的?

【问题讨论】:

标签: javascript functional-programming


【解决方案1】:

您应该查看Curried JavaScript Functions。我还没有完全理解他的咖喱函数,但它可能有你的答案。

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

【讨论】:

    【解决方案2】:

    我觉得讲偏函数应用完全没问题 在 JavaScript 中 - 如果它像部分应用程序一样工作,那么它必须 成为一个。不然怎么命名?

    你的 curry 函数如何实现他的目标只是一个实现 细节。以类似的方式,我们可以在 ECMAScript 规范中部分应用, 但是当 IE 像你一样实现它时,你会有 没办法查到。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

      • 您说的是“技术上”与“实践上”,但是“理论上”呢? “部分函数应用”是理论概念还是技术概念?如果我们将 curry/partial 函数想象为“概念函数”(而不是“Javascript 函数”),它不会得到“部分应用”吗?
      • 我认为“部分应用”是一个概念性的东西,而不是一个实现的东西。
      【解决方案4】:

      技术细节对我来说并不重要 - 如果语义保持不变,并且出于所有意图和目的,函数的行为就好像它真的是一个部分应用的函数,谁在乎呢?

      我以前对事情很学术,但担心这些细节最终并不能真正完成工作。

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

      【讨论】:

        【解决方案5】:

        他的观点是,由于 Javascript 函数原语本身并不支持“部分函数应用”

        您可以在 ES6 中非常优雅地进行柯里化:

        > const add = a => b => a + b
        > const add10 = add(10)
        > [1,2,3].map(add10)
        [ 11, 12, 13 ]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-15
          相关资源
          最近更新 更多