ホームページ > ウェブフロントエンド > jsチュートリアル > 機能的なJavaScriptにおけるカリーの初心者ガイド

機能的なJavaScriptにおけるカリーの初心者ガイド

William Shakespeare
リリース: 2025-02-19 11:45:11
オリジナル
571 人が閲覧しました

A Beginner's Guide to Currying in Functional JavaScript

機能的なJavaScriptにおけるカリーの初心者ガイド

カリー、または部分的なアプリケーションは、JavaScriptを作成するより伝統的な方法に精通している人々に混乱を招くように聞こえる機能的手法の1つです。しかし、適切に適用すると、実際に機能的なJavaScriptをより読みやすくすることができます。

キーテイクアウト

    Curryingは、関数の引数の部分的な適用を可能にする機能的なプログラミング手法です。つまり、関数が期待している引数のすべてまたはサブセットを渡すことができます。サブセットが渡された場合、残りの引数を待っている関数が返されます。
  • カリーは、JavaScriptコードをより読みやすく柔軟にすることができます。これにより、一貫して振る舞い、迅速に使用できる、簡単に構成された機能のライブラリを作成できます。コードを読むときに理解できます。
  • カレーするときは議論の順序が重要です。あるバリエーションから別のバリエーションに置き換える可能性が最も高い議論は、元の関数に渡された最後の議論である必要があります。
  • RAMDAなどの一部の機能的JavaScriptライブラリは、関数に必要なパラメーターを分割できる柔軟なカレー機能を提供し、それらを個別にまたはグループ内でカスタムカレーのバリエーションを作成できるようにします。カリーを広範囲に使用する予定がある場合は、そのようなライブラリを使用することをお勧めします。
  • より読みやすく、より柔軟な
  • 機能的なJavaScriptに宣伝されている利点の1つは、可能な限り少ない行で正しいポイントに到達し、繰り返しが少ない、より短くてタイトなコードです。時々、これは読みやすさを犠牲にして来ることがあります。機能的なプログラミングの仕組みに精通するまで、このように書かれたコードは読み取りと理解がより困難になる可能性があります。
  • 以前にカリーという用語に出くわしたが、それが何を意味するのかわからなかった場合は、気にする必要のないエキゾチックでスパイシーなテクニックと考えることを許されることができます。しかし、カレーは実際には非常に単純な概念であり、開発者に一連の柔軟なオプションを開きながら、関数引数を扱うときにいくつかの馴染みのある問題に対処します。
  • カリーとは?

簡単に言えば、カレーは関数の引数の部分的な適用を可能にする関数を構築する方法です。これが意味することは、関数が期待しているすべての引数を渡して結果を取得するか、それらの引数のサブセットを渡して、残りの引数を待っている関数を取り戻すことができるということです。それは本当に簡単です。

カリーは、機能的な概念を中心に構築されている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?"
ログイン後にコピー
このアプローチがどれほど強力であるか、特に非常に詳細なカスタム関数をたくさん作成する必要がある場合は、このアプローチがどれほど強力かを確認できます。唯一の問題は構文です。これらのCurried関数を構築する際に、ネストされた返された関数を維持し、それぞれが独自の孤立した引数を含む複数の括弧を必要とする新しい関数でそれらを呼び出す必要があります。乱雑になる可能性があります。

その問題に対処するために、1つのアプローチは、ネストされたすべてのリターンなしで記述された既存の関数の名前を取る迅速で汚れたカレー関数を作成することです。カレー関数は、その関数の引数のリストを引き出し、それらを使用して元の関数のカレーバージョンを返す必要があります。

これを使用するために、私たちはそれを事前に人口を増やしたいと思うだけの多くの引数とともに、任意の数の議論を取る関数の名前を渡します。私たちが戻ってきたのは、残りの議論を待っている関数です:

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"
ログイン後にコピー
ログイン後にコピー
私たちの小さなカレー関数は、欠落やオプションのパラメーターなどのすべてのエッジケースを処理しない場合がありますが、引数を渡すための構文について厳格にとどまる限り、合理的な仕事をします。

RAMDAなどの機能的なJavaScriptライブラリには、関数に必要なパラメーターを分割できる柔軟なカレー機能があり、個別にまたはグループで渡してカスタムカレーのバリエーションを作成できるようにします。カリーを広範囲に使用したい場合、これはおそらく行く方法です。

プログラミングにカリーを追加する方法に関係なく、ネストされた括弧を使用したい場合、またはより堅牢なキャリング機能を含めることを好むかどうかにかかわらず、カレー機能の一貫した命名規則を考え出すと、コードが作成されますより読みやすい。関数の各派生バリエーションには、それがどのように動作するか、それがどのような議論を期待しているかを明確にする名前を持つ必要があります。

引数順序

カリーが議論の順序であるときに留意することが重要なことの1つ。説明したアプローチを使用して、1つのバリエーションから次のバリエーションに置き換えられる可能性が最も高いという議論が、元の関数に渡された最後の引数であるという議論を明らかに望んでいます。

議論の順序について先に考えることで、カリーの計画を容易にし、それをあなたの仕事に適用します。そして、あなたの議論の順序を、最も変化する可能性が最も少ないという点であなたの議論の順序を考えることは、機能を設計するときにとにかく入るのは悪い習慣ではありません。

結論

カリーは、機能的なJavaScriptからの非常に便利な手法です。これにより、一貫して動作し、迅速に使用できる、簡単に構成された小さな構成機能のライブラリを生成でき、コードを読むときに理解できます。コーディングプラクティスにカレーを追加すると、コード全体で部分的に適用された機能の使用が促進され、潜在的な繰り返しを避け、機能の引数を命名して対処することについてのより良い習慣に導くのに役立つ可能性があります。

この投稿、あなたが楽しんだなら、あなたはシリーズの他のいくつかも好きかもしれません:

  • functional javascriptの紹介
  • JavaScript
  • の高次関数
  • 機能的javaScript
  • の再帰
  • 機能的なJavaScriptのカレーに関するよくある質問(FAQ)

JavaScriptのカレーと部分的なアプリケーションの主な違いは何ですか?

​​

カリーと部分的なアプリケーションは、両方ともJavaScriptのテクニックであり、関数のいくつかの引数を事前に埋めることができます。ただし、実装と使用法が異なります。 Curryingは、複数の引数を持つ関数が一連の関数に変換される機能プログラミングのプロセスであり、それぞれに単一の引数があります。一方、部分的なアプリケーションとは、関数に多くの引数を修正するプロセスを指し、より小さな供給の別の機能を生成します。カリーは常にネストされたunary(1-ality)関数を生成しますが、部分的なアプリケーションは任意のアリティの関数を生成できます。 JavaScriptの読みやすさと保守性。複雑な関数をよりシンプルで単一の機能に分割することにより、カリーはコードをより読みやすく理解しやすくします。また、各関数が単一のタスクを実行するため、よりクリーンでモジュラーコードを促進します。このモジュール性により、コードは特定の機能に問題を分離できるため、コードの維持とデバッグが容易になります。 3つの数値を追加する関数。カリーがなければ、関数は次のようになります。 )); // outputs:6

カリーを使用すると、同じ関数が次のように記述されます。 ){ a b c;

}

}

}

console.log(add(1)(2)(3)); // outputs:6

javascriptでカリーを使用することの制限または欠点は何ですか?


カリーには利点がありますが、いくつかの制限もあります。主な欠点の1つは、特に多数の議論を備えた機能を扱う場合、概念に精通していない人のためにコードを理解しにくいことです。また、追加の閉鎖が作成されたため、パフォーマンスオーバーヘッドにつながる可能性があります。さらに、各引数を別の括弧のセットに渡す必要があるため、関数呼び出しをより冗長にすることができます。 JavaScriptの高次関数の概念に関連しています。高次関数とは、1つ以上の関数を引数として取得する関数、結果として関数を返す関数、またはその両方です。カレーは関数を一連の関数呼び出しに変換することを伴うため、本質的に高次関数の使用が含まれます。

javascriptの矢印関数でカリーを使用できますか?

はい、javascriptの矢印関数でカリーを使用できます。実際、矢印関数の構文により、それらは特にカレーに適しています。以前の追加関数を矢印関数を使用して記述する方法は次のとおりです。 ); // outputs:6

人気のあるJavaScriptライブラリまたはフレームワークでカリーが使用されていますか?たとえば、JavaScriptの機能プログラミングのユーティリティ機能を提供するRamdaやLodashなどのライブラリの基本的な概念です。また、反応のための人気のある州管理ライブラリであるReduxにも使用されています。関数構成は、2つ以上の関数を組み合わせて新しい関数を作成するプロセスです。カリー化によりユナリ関数を作成できるため、各関数に正確に1つの入力と1つの出力があることを確認することにより、関数構成を簡素化します。 2つ以上の引数を持つ機能はカレーできます。ただし、実際には、機能をカレーすることは必ずしも実用的または有益であるとは限りません。たとえば、さまざまな時期に異なる数の引数で呼び出される必要がある関数には、カレーが役に立たない場合があります。あなたのコードはより読みやすくモジュール式であり、パフォーマンスにわずかな影響を与える可能性もあります。これは、関数をカレーするたびに、新しい閉鎖を作成するためです。ただし、ほとんどの場合、パフォーマンスへの影響はごくわずかであり、コードの読みやすさと保守性の向上の利点に加えています。

以上が機能的なJavaScriptにおけるカリーの初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート