引数の1つを適用して、任意の関数に適用して別の関数を返すことができるカレー関数を作成しようとしています。私が欲しいプロパティ:
- 関数に引数が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)
- カレー化された関数の長さは「必要に応じて」機能する必要がありますg.length=N => curry(g、x).length = N-1
Prototype Frameworkにはカレーの実装がいくつかあり、1つのブログで議論されています。ただし、この実装は、引数が1つしかない関数(1)ではうまく機能せず、関数の'length'属性が0(3)を返すため、適切ではありません。
最初のプロパティには、簡単な実装があります。
function curry(f,x) {
if (f.length == 1) return f(x);
...
}
しかし、3番目のルールを操作する方法がわかりません。つまり、ネストされた字句環境があり、fを使用できるため、関数を内部関数として構成できます。
function curry(f,x) {
return function() { ... }
}
ただし、この場合、パラメーターを明示的に設定することはできなくなります。一方、関数は「newFunction」ステートメントで作成できます。smthは次のようになります。
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キーワードで関数を作成するときにパラメータカウントを明示的に設定する方法はありますか?
- 'new Function'ステートメントで作成された関数の環境を設定する方法はありますか?
- 他の方法で私の問題を解決する方法はありますか?