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

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 までご連絡ください。
Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。