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