私の友人と私は 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
彼の意見は、Javascriptプリミティブは「部分関数適用」をネイティブにサポートしていないため、変数にバインドされた関数を部分適用function
と呼ぶのは完全に間違っているというものでした。karahi
彼の主張は、vindaloo
関数がカリー化されると、「部分的に適用された関数」ではなく、関数自体が完全に適用され、クロージャーが返されるというものでした。
さて、私の意見では、Javascript 自体はそのプリミティブでの部分的な適用をサポートしていませんがfunction
(たとえば ML や Haskell とは異なり)、言語の高次関数を作成できないという意味ではありません。部分的に適用された機能の概念をカプセル化します。また、「適用」されているにもかかわらず、関数のスコープはそれによって返されたクロージャにまだバインドされているため、「部分的に適用」されたままになります。
どちらが正しい?