- 基本的なアイデア
- 特徴
- 純粋な機能
- ファーストクラスの機能
- 参照の透明性
- 再帰
- 不変性
- 例
- 命令的および宣言的アプローチ
- 純粋な機能
- ファーストクラスのオブジェクトとして機能
- 利点
- 短くてわかりやすい
- 制御フローなし
- 短所
- 用途
- 機能的方法論
- 関数型プログラミングをサポートする言語
- D
- アーラン
- ハスケル
- ML
- Objective Caml
- スキーム
- 参考文献
関数型プログラミングパターンのプログラミングに対応するが、命令型プログラミングにおける主要概念であるプロセッサへの命令の機能の数学的モデルではなく、明示的な配列としてプログラムの動作を述べるの概念に基づいています。
関数型言語は、ステートメントを実行するのではなく、ステートメントと用語を強調します。このプログラミングでは、ローカルまたはグローバル状態に従う他の型とは異なり、結果は関数に渡されるパラメーターにのみ依存します。
Haskell関数型プログラミング言語でのマッピング関数の動作の図。出典:Plukeによる-独自の作業、CC0 commons.wikimedia.org。
その名前は、一連の入力を一連の出力に割り当てる数学関数に由来しています。数学関数は実際には何の働きもしませんが、むしろプロセスのモデルを記述し、関数によって入力のセットが生成するものを数式によって説明します。
基本的なアイデア
関数型プログラミングの基礎となったのは、20世紀の30年間に関数を定義および適用するために開発されたラムダ計算です。LISPは、1960年に設計されたこの種の最初のプログラミング言語でした。
ほとんどのプログラミング言語は、関数内から設定または使用できる入力、出力、および外部変数で構成されていますが、関数型プログラミングはこれを回避します。この考え方は、関数が同じパラメーターで呼び出されるたびに、同じ値を返す必要があるというものです。
特徴
関数型プログラミング言語はアプリケーションと呼ばれます。これは、関数がそれらのパラメーターに適用されるためです。また、定義では、計算方法ではなく計算対象を指定するため、宣言型および非手続き型です。
純粋な機能
関数は、外部変数の変更、ファイルシステムの変更など、観察可能な副作用がない場合に純粋です。
これらの関数は、コードの他の部分が依存している可能性がある変数を明示的に変更しないため、説得力があると見なされます。これらの制約を使用してコーディングするのは扱いにくいように思われますが、これらの関数は、確定的、予測可能、および合成可能であると見なされます。
ファーストクラスの機能
関数は、変数に割り当てることができる値と見なされるため、他の関数に渡したり、他の関数から返すことができます。つまり、関数は、あたかもパラメーターであるかのように、または返される値として使用できます。
これは、関数の結果だけでなく、関数をそのまま渡すことができることを意味します。たとえば、入力パラメーターの値の2倍を返すdouble(x)関数について考えてみます。したがって、double(2)は4を返します。
これはファーストクラスの関数なので、コード(double(double(2))はdouble(4)のコードと同じになります。これにより、ある関数を別の関数のパラメーターとしてネストすることができます。
参照の透明性
これは、このプログラミングパターンには代入ステートメントがないことを示しています。つまり、追加の値を保存する場合は、新しい変数を定義する必要があります。したがって、変数の状態は常に一定です。
これにより、プログラムの実行中に変数を実際の値に置き換えることができるため、不要な影響が発生する可能性がほとんどなくなります。
再帰
関数型プログラミングでは、「for」ループと「while」ループはありません。代わりに、反復は再帰に依存しています。再帰は再帰関数を使用して実装され、基本ケースに到達するまで繰り返し呼び出されます。
不変性
変数は不変です。つまり、初期化された変数を変更することはできません。新しい変数を作成できますが、既存の変数を変更することはできません。
例
命令的および宣言的アプローチ
例を使用すると、これらのアプローチの違いを分析して、両方の配置で同じ操作を実行できます。つまり、5未満の偶数を5に置き換えて、リストから奇数をフィルタリングします。
同じ計算で、同じ結果になります。ただし、ご覧のとおり、命令型コードは冗長であり、すぐにはわかりません。一方、宣言的なアプローチは、取得したいものに焦点を当てているため、読みやすく明示的です。
純粋な機能
純粋および不純な関数として定義されているものは、いくつかの基本的な例で明確にすることができます。
ファーストクラスのオブジェクトとして機能
データを使用するのと同じ方法で関数を使用することを意味します。したがって、別の関数にパラメーターとして渡すことができます。次の例では、int関数をパラメーターとしてmap関数に渡すことができます。
>>>リスト(マップ(int、))
それらを変数に割り当てて返すことができます。たとえば、次のコードでは、hello_world関数を割り当てて、変数を関数として実行できます。
利点
-達成したい方法(宣言型)ではなく、達成したい方法(宣言型)ではなく、
-代入文が含まれていないため、変数に値が指定された後、変数は変更されません。したがって、関数型プログラムには副作用が含まれていません。
-状態の分散が少なく、暗黙的に変更されないため、論理フローは明確です。
-遅延評価の概念をサポートします。つまり、値は必要なときにのみ評価および保存されます。
-純粋な関数は状態を変更せず、入力に完全に依存しているため、簡単に理解できます。このような関数によって返される戻り値は、それらによって生成される結果と同じです。
-変数や外部データの変更を回避する純粋関数の性質により、同時実行性の実装が有効になります。
-関数は値として扱われ、他の関数にパラメーターとして渡されます。これにより、コードの理解と可読性が向上します。
-純粋な関数はパラメーターを1回受け取り、不変の出力を生成します。変更できない値を使用すると、デバッグとテストが簡単になります。
短くてわかりやすい
それらは命令型よりも短く、理解しやすいです。研究によると、コード行に関するプログラマの平均的な生産性は、どのプログラミング言語でもほぼ同じであり、生産性の向上につながります。
制御フローなし
関数の呼び出しは、その結果の計算と異なる効果を持つことはできません。これにより、式の値を変更する副作用がなく、いつでも評価できるため、主要なエラーの原因が排除され、実行順序も無関係になります。
プログラマーは、制御のフローを確立する負担から解放されます。式はいつでも評価できるため、変数はその値に置き換えることができます。
この自律性により、関数型プログラムは従来のプログラムより数学的に管理しやすくなります。
短所
-関数型プログラミングのパラダイムは単純ではないため、初心者には理解が困難です。
-エンコーディング中に多くのオブジェクトが進化するため、メンテナンスが困難です。
-場合によっては、純粋な関数を作成すると、コードの可読性が低下します。
-不変の値と再帰を組み合わせると、システムパフォーマンスが大幅に低下する可能性があります。
-再利用は非常に複雑で、継続的なリファクタリングが必要です。
-ループやループを使用する代わりに再帰的なスタイルでプログラムを作成することは、非常に困難な作業になる可能性があります。
-オブジェクトが問題を正しく表していない可能性があります。
-純粋な関数を書くことは簡単であることがわかりますが、それらをアプリケーションの他の部分や入出力操作と組み合わせるのは非常に困難です
用途
人工知能プログラミングは関数型プログラミング言語で行われ、人工知能技術は実際のアプリケーションに移行します。
また、複雑な数学モデルの実装にも優れています。このため、関数型言語の主な用途の1つは伝統的に学術的でした。実行可能な仕様やプロトタイプ実装の開発に役立ちます。
多くの関数型言語も、並列処理の実装に優れています。これは、実行された順序に関係なく常に同じ値を返す純粋な関数を利用できるためです。
機能的方法論
WhatsAppは関数型プログラミングモデルに従うErlangプログラミング言語を使用しているため、100名以上の従業員が約16億人のデータを処理できます。
関数型プログラミングスタイルのもう1つの重要なキャリアはHaskellです。Facebookのアンチスパムシステムで使用されています。最も広く使用されているプログラミング言語の1つであるJavaScriptでさえ、動的に型付けされた関数型言語の特性を誇示します。
関数型プログラミングをサポートする言語
D
これはC ++の後に設計され、Cとの互換性が必要であるという観察された弱点を排除しながら、そのすべての利点を得ています。
アーラン
非常にスケーラブルで並行性があり、大量のデータを予測できない順序で受信する通信やその他のアプリケーションに最適です。
ハスケル
これは、ラムダ計算を使用する純粋な関数型プログラミング言語です。
ML
数学、科学、金融、分析、その他のアプリケーションで使用されます。その長所の1つは、他のプログラムを処理するソフトウェアを作成することです。
Objective Caml
Camlをベースにしたオープンソース言語です。それは非常に軽量なプログラムを作成する傾向があり、他の言語で作成されたものよりも速くロードして実行するのに役立ちます。
スキーム
これは、LISP構文とALGOL構造に基づいています。シンプルであるため、多くのコンピュータサイエンスコースでプログラム設計の入門として使用され、コンピュータプログラミングの基本の一部を紹介しています。
参考文献
- これをホストしている人(2019)。関数型プログラミングを学ぶ:このスタイルのコーディングはあなたの心を吹き飛ばします。取得元:whoishostingthis.com。
- アンドレア・ベルトリ(2019)。関数型プログラミングの適切な紹介。取得元:dev.to。
- ハッカーアース(2020)。関数型プログラミング。hackerearth.comから取得。
- Clojure(2020)。関数型プログラミング。clojure.orgから取得。
- Akhil Bhadwal(2020)。関数型プログラミング:概念、利点、欠点、およびアプリケーション。ハック。取得元:hackr.io。
- Guru99(2020)。関数型プログラミングとは 例付きチュートリアル。取得元:guru99.com。