我正在尝试创建可应用于任何函数并返回另一个函数的curry 函数,其中应用了 1 个参数。我想拥有的属性:
- 如果函数只有一个参数,curry 函数应该返回值:f(a); 咖喱(f,x)= f(x);
- 如果函数有很多参数,currey 应该重新运行 curried 函数:g(a1,a2,..,aN); 咖喱(g,x) = g2(a2,..,aN) : g2(a2,..aN)=g(x,a2,...,aN)
- curry 函数的长度属性应该“根据需要”工作 g.length = N => curry(g,x).length = N-1
Prototype Framework 中有一些 curry 的实现,在一篇博客中有讨论。但是这种实现并不好,因为它不适用于只有一个参数 (1) 的函数,并且返回函数“长度”属性为 0 (3)。
对于第一个属性,有一个简单的实现:
function curry(f,x) {
if (f.length == 1) return f(x);
...
}
但我不知道如何使用第三条规则,即函数可以构造为内部函数,因为会有一个嵌套的词法环境并且能够使用 f:
function curry(f,x) {
return function() { ... }
}
但在这种情况下,我将不再能够显式设置参数。另一方面,可以使用“new Function”语句构造函数,就像这样:
function curry(f,x) {
var args = [];
for (var i=1; i<f.length; i++) {
args.push('a'+i);
}
var sa = args.join();
return new Function(sa,"return f(x,"+sa+")");
}
但在这种情况下,f 和 x 将解除绑定,因为匿名函数将在全局词法环境中创建。
所以问题:
- 有没有办法在使用 function 关键字创建函数时显式设置参数计数?
- 有没有办法设置使用“新功能”语句创建的功能环境?
- 我们有办法以任何其他方式解决我的问题吗?