我和我的一个 friend 正在讨论 Javascript 中的柯里化(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 function
原语本身不支持“部分函数应用”,因此将绑定(bind)到变量 karahi
的函数称为是完全错误的部分应用。他的论点是当 vindaloo
函数被柯里化(Currying)时,函数本身被完全应用并返回一个闭包,而不是“部分应用的函数”。
现在,我的观点是,虽然 Javascript 本身不在其“function
”原语中提供对部分应用程序的支持(与 ML 或 Haskell 不同),但这并不意味着您不能创建语言的高阶函数,能够封装部分应用函数的概念。此外,尽管被“应用”,函数的范围仍然绑定(bind)到它返回的闭包,导致它保持“部分应用”。
哪个是正确的?
最佳答案
从技术上讲,您正在创建一个调用原始函数的全新函数。因此,如果我对部分应用函数的理解是正确的,那么这不是部分应用函数。部分应用的函数将更接近于此(请注意,这不是通用解决方案):
vindaloo.curry = function(a) {
return function(b) {
return a + b;
};
};
IIUC,这仍然不是部分应用的函数。但它更近了。如果您可以检查代码,那么真正的部分应用函数实际上看起来像这样:
function karahi(b) {
return 1 + b;
};
因此,从技术上讲,您的原始方法是只是返回一个绑定(bind)在闭包中的函数。我能想到的在 JavaScript 中真正部分应用函数的唯一方法是解析函数、应用更改,然后通过 eval() 运行它。
但是,您的解决方案很好地实际应用了 JavaScript 概念,因此实际上实现了目标,即使它在技术上并不准确。
关于javascript - "Partial Function Application"在 Javascript 上下文中是用词不当吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/92984/