在Javascript上下文中,"部分功能应用程序"是否用词不当?
我的一个朋友和我正在讨论有关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()函数,可以帮助创建这样的函数。我喜欢