カレー機能の実際の使用例は?[閉まっている]


8

カレー機能の実際の使用例を見つけ、カレーを使用するメリットを得るのに苦労しました。

カレー機能をググると、次のような例がよく見られます

let add = x => y => x + y;
let add10 = add(10);
console.log(add10(20));

この例ではカレーを使用することの価値が本当にわからないのです。

このSO /programming/113780/javascript-curry-what-are-the-practical-applicationsの回答を読んだ後でも、それを使用する利点がわかりません。

たとえば、最高得点の回答はコンバーターの例ですが、別の回答が示すように、その例はカレーなしで書き直すことができます。

私も答えを読みますカレーの利点は何ですか?(議論はjavascriptに限定されていませんが)カリーバージョンはjsで)カリーなしで書き直すことができるという感覚を私はまだ得ています。

それで、誰かが私にJavaScriptでカレーを使用することの「本当の」利点/利点を示すことができますか?

----更新----

私が得た答えを除いて、私はここでログの例を見つけそれを使用する利点を示しています。



2
オンラインで見つけたカレーの基本的な例のほとんどが非常に印象的でないことに同意します。
user949300

@ user949300ところで、質問がなぜ投票されたのか本当にわかりません。jsカレーについて考えるとき、「有効な」質問ではありませんか?SOで閉まってしまうのではないかと心配していたので、こちらに伺いました。:(
Qiulang 2018

外部lib関数が指定された数の引数をとる関数(たとえば、コールバック)を期待し、より多くの引数をとる関数(たとえば、ハンドラー)を持っているが、これらの追加の引数に定数値を渡したい場合に、カレーが最も役立つことがわかりました。部分コピーは、矢印関数を作成するよりも読みやすくなります
tutuDajuju

3
「カレーなしでカレーバージョンを書き直すことができるという感覚はまだあります」–カレーの目的はそれだけなので、これは簡単なことです。カリー化の重要な点は、n個のパラメーターの関数は、n番目のパラメーターを取る関数を返すn-1個のパラメーターの関数として書き直すことができるという観察です。また、この説明はほとんどすべてに当てはまることにも注意してください。すべてのforループはループとして書き直すことができwhileます。すべてのifステートメントはwhileループとして書き直すことができます。すべてのwhileループをとして書き直すことができますgoto。それはそれらが役に立たないという意味ではありません。
イェルクWミッターク

回答:


8

私は自分でカリー化を使用したことはほとんどありませんが、これが有用であることが判明した最近の例です。私はゲームBattlesnakeをコーディングしていましたが、これは多くのゲームに当てはまります。彼らはあなたにあなたのヘビ、敵のヘビ、そして食べ物の場所を与えるさまざまな配列を提供します。特定の{x、y}ポイントへの移動を検討していて、別のヘビ、食べ物、または自分自身が含まれているかどうかを確認するとします。最初のパスは、次のようなコードを書くことです(関数と新しい矢印の組み合わせを使用します)。

// utility function
function samePoint(p1, p2) {
  return (p1.x === p2.x) && (p1.y === p2.y);
}

コードのどこかに行く

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some((p) => samePoint(p, possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

悪くはありませんが、コードの多くの場所でこれを行うので、少々面倒で不格好です。そして、私の経験から、2つの議論は簡単に混乱します。:-(根本的な問題は、some()(またはfind()単一の引数のみを取る関数を受け入れ、実際には2つの引数、つまり2つの点が必要なことです。つまり、カリー化を考えます!ここでは多くの場合、矢印を使用します。

function samePointAs(p1) {
  return function(p2) {
    return samePoint(p1, p2);
  }
}

次に、あなたの「その食べ物ですか」テストは

let possibleMove = {x,y}; // where you are thinking of moving
...
if (foodArray.some(samePointAs(possibleMove )) {
  // this move looks tasty, give it a bonus value...
}

これはあなたをインターネットの億万長者にするつもりですか?おそらく違います。しかし、それは単純化し、この場合、コードを明確にします。


こんにちは私はあなたの例が好きなので、私はあなたの答えを受け入れられた答えとしてマークしました。ありがとう。
Qiulang 2018

こんにちは、私の質問は保留されています。それも削除票を得ました。それを編集して、無駄に保留にするようにしていました。編集を手伝ってくれませんか?
Qiulang

14

あなたの例でカレーすることは実際には意味がありません、私は同意します。カレーの機能を確認するには、高次関数と組み合わせる必要があります。別の関数をパラメーターとして取る関数です。

この最も典型的な例は、マップ、フィルター、および縮小ですが、別の一般的な状況はコールバックです。関数を部分的に適用する場合、部分的に適用された関数をこれらの高次関数に渡すことができます。関数を使用したい場合のほとんどが部分的なアプリケーション用であり、別の高次関数に渡すことができる場合、カリー化は理にかなっています。

より具体的な例は次のようになります。

let array1 = [1, 4, 9, 16];
let add = x => y => x + y;
array2 = array1.map(foo ? add(10) : add(20));

必要なときに通常の関数から無名/矢印関数をいつでも作成できるため、カリー化は必要ありませんが、場合によっては、通常の関数と比較してカリー関数を使用すると非常に便利です(他の状況では、物事を煩わしく遅くする)。


2
「しかし、いくつかの状況では、カレー機能を通常のものと比較すると非常に便利な場合があります」ので、その例をいくつか挙げていただけますか?ありがとう!
Qiulang 2018

@Qiulang 1つの例は、多数のパラメーターを持つ関数を呼び出す方法を制御する一連の構成ロジックがある場合です。カリー化された関数がない場合は、流れるようなAPIを持つオブジェクトを作成するか、何らかのclone_and_update()メソッドを提供するか、関数パラメーターを構築するために別のビルダークラスを作成する必要があります徐々に。この典型的な例は、ORMのクエリビルダーです。カレー関数を使用すると、各ステップで通常どおりに関数を呼び出すことができます。
リーライアン

@LieRyan JavaScriptで、を使用してオプションの「オブジェクト」を作成するのが非常に簡単な場合{}、Builderクラスが非常に有用または一般的であることがわかりませんでした。いくつか例を挙げることができますか?
user949300

1
@ user949300パラメータが1つまたは2つだけ異なる10個のメンバーを持つ20個のオブジェクトを作成することは、JSでは他のどの言語よりも簡単ではありません。Fluentインターフェイスを使用する不変のビルダーオブジェクトを使用すると、代わりに基本構成オブジェクトを構築してから、分岐してさまざまな引数セットを作成できます。この種のパターンは、多くの場合、アプリケーションコードでは非常に重く見えるかもしれませんが、ライブラリ/フレームワークの作成者にはかなり一般的です。
リーライアン

1
ポイントは取られましたが、newLangledを使用した@LieRyan Object.assign()は、基本構成から分岐するのが非常に簡単です。
user949300 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.