11

私の友人と私は 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 とは異なり)、言語の高次関数を作成できないという意味ではありません。部分的に適用された機能の概念をカプセル化します。また、「適用」されているにもかかわらず、関数のスコープはそれによって返されたクロージャにまだバインドされているため、「部分的に適用」されたままになります。

どちらが正しい?

4

5 に答える 5

3

JavaScript での部分関数適用について話すのはまったく問題ないと思います。他にどのように名前を付けますか?

カリー関数が目標をどのように達成するかは、実装の詳細にすぎません。同様の方法で、ECMAScript 仕様に部分的な適用を行うこともできますが、IE があなたと同じようにそれを実装すると、それを見つける方法がありません。

于 2008-09-18T14:44:55.290 に答える
3

技術的には、元の関数を呼び出す新しい関数を作成しています。したがって、部分適用機能に関する私の理解が正しければ、これは部分適用機能ではありません。部分的に適用された関数はこれに近くなります (これは一般的な解決策ではないことに注意してください)。

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC、これはまだ部分的に適用された機能ではありません. しかし、それは近いです。コードを調べることができれば、実際に部分的に適用された関数は次のようになります。

function karahi(b) {
    return 1 + b;
};

したがって、技術的には、元のメソッドクロージャー内でバインドされた関数を返すだけです。JavaScript で関数を真に部分的に適用する唯一の方法は、関数を解析し、変更を適用してから、eval() を介して実行することです。

ただし、あなたのソリューションは JavaScript への概念の優れた実用的なアプリケーションであるため、技術的に正確でなくても、実際に言えば目標を達成します。

于 2008-09-18T14:48:34.737 に答える
1

技術的な詳細は私には関係ありません-セマンティクスが同じままであり、すべての意図と目的のために、関数が実際に部分的に適用された関数であるかのように機能する場合、誰が気にしますか?

私は以前は物事について学問的でしたが、そのような詳細について心配することは最終的に実際の仕事を成し遂げることができません。

個人的には、MochiKitを使用しています。そのようなものの作成を支援する素晴らしいpartial()関数があります。私はそれが大好きです。

于 2008-09-18T15:38:43.227 に答える
0

Curried JavaScript Functionsをチェックしてください。私は彼のカレー関数について完全に頭を悩ませていませんが、あなたの答えがあるかもしれません.

編集:しかし、私はあなたの評価に同意します.

于 2008-09-18T14:43:44.887 に答える