我和我的一个朋友正在讨论 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
他的观点是,由于 Javascriptfunction
原语本身并不支持“部分函数应用”,因此将绑定到变量的函数karahi
称为部分应用是完全错误的。他的论点是,当vindaloo
函数被柯里化时,函数本身被完全应用并返回一个闭包,而不是“部分应用的函数”。
现在,我的观点是,虽然 Javascript 本身不支持其function
原语中的部分应用程序(不像 ML 或 Haskell),但这并不意味着您不能创建该语言的高阶函数,它能够封装部分应用函数的概念。此外,尽管被“应用”,函数的范围仍然绑定到它返回的闭包,导致它保持“部分应用”。
哪个是对的?