導入
関数型プログラミングは、すべてを純粋な数学関数スタイルにバインドしようとするプログラミング パラダイムです。宣言型のプログラミング スタイルです。解決方法が主な焦点となる命令型スタイルとは対照的に、何を解決するかが主な焦点となります。ステートメントの代わりに式を使用します。式は値を生成するために評価されますが、ステートメントは変数を割り当てるために実行されます。これらの関数には、以下で説明するいくつかの特別な機能があります。
関数型プログラミングはラムダ計算に基づいています。
ラムダ計算は、関数を使用した計算を研究するために Alonzo Church によって開発されたフレームワークです。世界最小のプログラミング言語とも言えます。それは何が計算可能であるかの定義を与えます。ラムダ計算で計算できるものはすべて計算可能です。計算能力においてはチューリングマシンと同等です。関数とその評価を説明するための理論的枠組みを提供します。これは、現在のほぼすべての関数型プログラミング言語の基礎を形成しています。
事実: アラン チューリングは、命令型プログラミング スタイルの基礎を築いたチューリング マシンを作成したアロンゾ チャーチの学生でした。
関数型プログラミングをサポートするプログラミング言語: Haskell、JavaScript、Python、Scala、Erlang、Lisp、ML、Clojure、OCaml、Common Lisp、Racket。
関数型プログラミングの概念:
- 純粋関数
- 再帰 参照の透過性 関数はファーストクラスであり、高次の変数も可能 変数は不変
純粋な関数: これらの関数には 2 つの主なプロパティがあります。まず、他のものに関係なく、同じ引数に対して常に同じ出力が生成されます。
第二に、副作用はありません。つまり、引数、ローカル/グローバル変数、入出力ストリームを変更しません。
後のプロパティは不変性と呼ばれます。純粋な関数の唯一の結果は、それが返す値です。それらは決定論的です。
関数型プログラミングを使用して作成されたプログラムは、純粋な関数には副作用や隠れた I/O がないため、デバッグが簡単です。純粋な関数を使用すると、並列/同時アプリケーションの作成も容易になります。コードがこのスタイルで記述されると、スマート コンパイラーは多くのことを実行できます。命令を並列化し、必要なときに結果の評価を待機し、入力が変更されない限り結果は変わらないため、結果を記憶することができます。
純粋な関数の例:
sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>
再帰: 関数型言語には for ループや while ループはありません。関数型言語の反復は再帰によって実装されます。再帰関数は、基本ケースに到達するまで、それ自体を繰り返し呼び出します。
再帰関数の例:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
参照透明度: 関数型プログラムでは、一度定義された変数はプログラム全体を通じてその値を変更しません。関数型プログラムには代入文がありません。何らかの値を保存する必要がある場合は、代わりに新しい変数を定義します。これにより、実行のどの時点でも変数を実際の値に置き換えることができるため、副作用の可能性が排除されます。どの変数の状態も常に一定です。
例:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
関数はファーストクラスであり、より高次のものにすることもできます。 第一級関数は第一級変数として扱われます。最初のクラス変数は、パラメーターとして関数に渡すことも、関数から返すことも、データ構造に格納することもできます。高階関数は、他の関数を引数として取り、関数を返すこともできる関数です。
例:
show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function> 変数は不変です: 関数型プログラミングでは、変数を初期化した後に変更することはできません。新しい変数を作成することはできますが、既存の変数を変更することはできません。これは、プログラムの実行時を通じて状態を維持するのに非常に役立ちます。変数を作成してその値を設定すると、その変数の値が決して変更されないことがわかって、完全な自信を持つことができます。
関数型プログラミングの長所と短所
利点:
- 純粋関数は状態を変更せず、与えられた入力のみに依存するため、理解しやすくなります。生成される出力はすべて、返される値です。それらの関数シグネチャは、それらに関するすべての情報、つまり戻り値の型と引数を示します。
- 関数を値として扱い、それをパラメータとして関数に渡す関数型プログラミング言語の機能により、コードがより読みやすく、理解しやすくなります。
- テストとデバッグが簡単になります。純粋な関数は引数のみを受け取り、出力を生成するため、入力を受け取ったり、何らかの非表示の出力を生成したりすることはなく、変更は生成されません。これらは不変の値を使用するため、純粋な関数を使用して書かれたプログラムの問題をチェックすることが容易になります。
- 純粋関数は外部の変数やその他のデータを変更しないため、同時実行/並列処理の実装に使用されます。
- 必要な場合にのみ値が評価および保存されるため、繰り返しの評価を避ける遅延評価が採用されています。
短所:
- 純粋な関数を作成すると、コードの可読性が低下する場合があります。
- ループを使用せずに再帰的スタイルでプログラムを作成するのは、少し怖いかもしれません。
- 純粋な関数を書くのは簡単ですが、それをアプリケーションの残りの部分や I/O 操作と組み合わせるのは難しい作業です。
- 不変の値と再帰はパフォーマンスの低下につながる可能性があります。
アプリケーション:
- 数学的な計算で使用されます。
- 同時実行性または並列性が必要な場合に必要になります。
事実: Whatsapp は 900M の開発に必要なエンジニアはわずか 50 人です ユーザー Erlang は同時実行性のニーズを実装するために使用されるためです。 Facebook はスパム対策システムに Haskell を使用しています。