カリー、または部分的なアプリケーションは、JavaScriptを作成するより伝統的な方法に精通している人々に混乱を招くように聞こえる機能的手法の1つです。しかし、適切に適用すると、実際に機能的なJavaScriptをより読みやすくすることができます。
キーテイクアウトカリーは、機能的な概念を中心に構築されているHaskellやScalaなどの言語では元素です。 JavaScriptには機能的な機能がありますが、カリーはデフォルトでは組み込まれていません(少なくとも現在の言語のバージョンではそうではありません)。しかし、私たちはすでにいくつかの機能的なトリックを知っているので、JavaScriptで私たちのためにカリーを作ることができます。
これがどのように機能するかを感じるために、おなじみの構文を使用して、私たちが望むカレー機能を構築して、JavaScriptで最初のカレー機能を作成しましょう。例として、名前で誰かに挨拶する関数を想像しましょう。私たちは皆、名前と挨拶をするシンプルな挨拶関数を作成し、コンソールに名前を付けて挨拶を記録する方法を知っています:
var greet = function(greeting, name) { console.log(greeting + ", " + name); }; greet("Hello", "Heidi"); //"Hello, Heidi"
私たちの最初のカレー
var greetCurried = function(greeting) { return function(name) { console.log(greeting + ", " + name); }; };
var greetHello = greetCurried("Hello"); greetHello("Heidi"); //"Hello, Heidi" greetHello("Eddie"); //"Hello, Eddie"
ブラウザでこれを試してみませんか?
greetCurried("Hi there")("Howard"); //"Hi there, Howard"
すべてのことをカレー!
2つの引数と同じ柔軟性があるのと同じ柔軟性があります。ネスティングがどこまで進んでも、私たちは私たちの目的に合っているのと同じくらい多くの方法で選択する限り多くの人々を迎えるために新しいカスタム関数を作成できます:
var greetDeeplyCurried = function(greeting) { return function(separator) { return function(emphasis) { return function(name) { console.log(greeting + separator + name + emphasis); }; }; }; };
さらに、元のカレー関数にカスタムバリエーションを作成するときに好きなだけパラメーターを渡すことができ、適切な数の追加パラメーターを使用できる新しい関数を作成できます。
var greetAwkwardly = greetDeeplyCurried("Hello")("...")("?"); greetAwkwardly("Heidi"); //"Hello...Heidi?" greetAwkwardly("Eddie"); //"Hello...Eddie?"
そして、下位のバリエーションを簡単に定義できます:
var sayHello = greetDeeplyCurried("Hello")(", "); sayHello(".")("Heidi"); //"Hello, Heidi." sayHello(".")("Eddie"); //"Hello, Eddie."
伝統的な機能をカレー
var askHello = sayHello("?"); askHello("Heidi"); //"Hello, Heidi?" askHello("Eddie"); //"Hello, Eddie?"
これを使用するために、私たちはそれを事前に人口を増やしたいと思うだけの多くの引数とともに、任意の数の議論を取る関数の名前を渡します。私たちが戻ってきたのは、残りの議論を待っている関数です:
var greet = function(greeting, name) { console.log(greeting + ", " + name); }; greet("Hello", "Heidi"); //"Hello, Heidi"
そして、前と同じように、私たちは、カレーの元の関数から微分関数を構築するときに使用したい引数の数に関しては限定されません:
var greetCurried = function(greeting) { return function(name) { console.log(greeting + ", " + name); }; };
カリーについて真剣に取り組む
var greetHello = greetCurried("Hello"); greetHello("Heidi"); //"Hello, Heidi" greetHello("Eddie"); //"Hello, Eddie"
プログラミングにカリーを追加する方法に関係なく、ネストされた括弧を使用したい場合、またはより堅牢なキャリング機能を含めることを好むかどうかにかかわらず、カレー機能の一貫した命名規則を考え出すと、コードが作成されますより読みやすい。関数の各派生バリエーションには、それがどのように動作するか、それがどのような議論を期待しているかを明確にする名前を持つ必要があります。
引数順序カリーが議論の順序であるときに留意することが重要なことの1つ。説明したアプローチを使用して、1つのバリエーションから次のバリエーションに置き換えられる可能性が最も高いという議論が、元の関数に渡された最後の引数であるという議論を明らかに望んでいます。
議論の順序について先に考えることで、カリーの計画を容易にし、それをあなたの仕事に適用します。そして、あなたの議論の順序を、最も変化する可能性が最も少ないという点であなたの議論の順序を考えることは、機能を設計するときにとにかく入るのは悪い習慣ではありません。
カリーは、機能的なJavaScriptからの非常に便利な手法です。これにより、一貫して動作し、迅速に使用できる、簡単に構成された小さな構成機能のライブラリを生成でき、コードを読むときに理解できます。コーディングプラクティスにカレーを追加すると、コード全体で部分的に適用された機能の使用が促進され、潜在的な繰り返しを避け、機能の引数を命名して対処することについてのより良い習慣に導くのに役立つ可能性があります。
この投稿、あなたが楽しんだなら、あなたはシリーズの他のいくつかも好きかもしれません:カリーを使用すると、同じ関数が次のように記述されます。 ){
}
console.log(add(1)(2)(3)); // outputs:6javascriptでカリーを使用することの制限または欠点は何ですか?
カリーには利点がありますが、いくつかの制限もあります。主な欠点の1つは、特に多数の議論を備えた機能を扱う場合、概念に精通していない人のためにコードを理解しにくいことです。また、追加の閉鎖が作成されたため、パフォーマンスオーバーヘッドにつながる可能性があります。さらに、各引数を別の括弧のセットに渡す必要があるため、関数呼び出しをより冗長にすることができます。 JavaScriptの高次関数の概念に関連しています。高次関数とは、1つ以上の関数を引数として取得する関数、結果として関数を返す関数、またはその両方です。カレーは関数を一連の関数呼び出しに変換することを伴うため、本質的に高次関数の使用が含まれます。
はい、javascriptの矢印関数でカリーを使用できます。実際、矢印関数の構文により、それらは特にカレーに適しています。以前の追加関数を矢印関数を使用して記述する方法は次のとおりです。 ); // outputs:6
人気のあるJavaScriptライブラリまたはフレームワークでカリーが使用されていますか?たとえば、JavaScriptの機能プログラミングのユーティリティ機能を提供するRamdaやLodashなどのライブラリの基本的な概念です。また、反応のための人気のある州管理ライブラリであるReduxにも使用されています。関数構成は、2つ以上の関数を組み合わせて新しい関数を作成するプロセスです。カリー化によりユナリ関数を作成できるため、各関数に正確に1つの入力と1つの出力があることを確認することにより、関数構成を簡素化します。 2つ以上の引数を持つ機能はカレーできます。ただし、実際には、機能をカレーすることは必ずしも実用的または有益であるとは限りません。たとえば、さまざまな時期に異なる数の引数で呼び出される必要がある関数には、カレーが役に立たない場合があります。あなたのコードはより読みやすくモジュール式であり、パフォーマンスにわずかな影響を与える可能性もあります。これは、関数をカレーするたびに、新しい閉鎖を作成するためです。ただし、ほとんどの場合、パフォーマンスへの影響はごくわずかであり、コードの読みやすさと保守性の向上の利点に加えています。
以上が機能的なJavaScriptにおけるカリーの初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。