【发布时间】: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