関数型プログラミングとは何ですか?
⚡ スマートサマリー
関数型プログラミングとは、共有状態や可変データを避け、純粋関数を組み合わせることでソフトウェアを構築する手法です。文よりも式を重視するため、関数の出力は入力のみに依存し、プログラムの予測可能性とテスト容易性を高めます。
関数型プログラミングとは何ですか?
関数型プログラミング(FPとも呼ばれる)は、純粋関数を作成することでソフトウェアを構築する考え方である。オブジェクト指向プログラミングに見られる共有状態や可変データといった概念は排除される。
関数型言語は、文の実行よりも式や宣言を重視します。そのため、ローカル状態やグローバル状態に依存する他の手続きとは異なり、関数型言語における値の出力は、関数に渡される引数のみに依存します。
関数型プログラミングの特徴
- 関数型プログラミング手法は、プロセスではなく結果に焦点を当てる。
- 重点は、何を計算すべきかという点に置かれています。
- データは不変である。
- 関数型プログラミングは、問題を関数に分解する。
- これは、条件式と再帰を用いて計算を実行する数学関数の概念に基づいて構築されています。
- ループ文のような反復処理や、If-Else文のような条件文はサポートしていません。
関数型プログラミングの歴史
- 関数型プログラミングの基礎となるのはラムダ計算である。これは、関数の適用、定義、および再帰のために1930年代に開発された。
- LISPは最初の関数型プログラミング言語である。マッカーシーが1960年に設計した。
- 70年代後半、エジンバラ大学の研究者たちはML(メタ言語)を定義した。
- 80年代初頭、Hope言語は再帰と等式推論のための代数的データ型を追加した。
- 2004年に、関数型言語「Scala」が開発された。
関数型プログラミング言語
関数型プログラミング言語の目的は、数学的な関数を模倣することである。しかし、関数型プログラミングにおける計算の基本的なプロセスは、数学的な関数とは異なる。
以下に、最も代表的な関数型プログラミング言語をいくつか紹介します。
- ハスケル
- SML
- Clojureの
- スカラ
- アーラン
- 石斑魚
- F#
- ML/OCaml Lisp / スキーム
- XSLT
- SQL
- Mathematica
基本的な関数型プログラミングの用語と Concepts
不変データ
不変データとは、既存のデータ構造を変更するのではなく、容易に新しいデータ構造を作成できることを意味します。
参照透明性
関数型プログラムは、まるで初めて実行するかのように操作を実行するべきです。そうすることで、プログラムの実行中に何が起こったのか、何が起こらなかったのか、そしてその副作用を把握することができます。関数型プログラミングの用語では、これを参照透過性と呼びます。
モジュール性
モジュール設計は生産性を向上させます。小さなモジュールは迅速にコーディングでき、再利用の可能性も高まるため、プログラム開発のスピードアップにつながります。さらに、モジュールを個別にテストできるため、単体テストやデバッグにかかる時間を短縮できます。
保守性
保守性とは、関数型プログラミングは保守が容易であることを意味する単純な用語です。なぜなら、与えられた関数以外のものを誤って変更してしまうことを心配する必要がないからです。
最高級の関数
「第一級関数」とは、使用に制限のないプログラミング言語の要素を指す定義です。したがって、第一級関数はプログラム内のどこにでも出現させることができます。
閉鎖
クロージャとは、親関数が実行された後でも、親関数の変数にアクセスできる内部関数のことです。
高階関数
高階関数は、他の関数を引数として受け取るか、結果として返します。
高階関数では、部分適用やカリー化が可能です。この手法では、関数を引数に一つずつ適用し、適用するたびに次の引数を受け取る新しい関数を返します。
純粋な機能
「純粋な関数」とは、入力が入力として宣言されており、その入力が隠蔽されるべきでない関数です。 出力は出力としても宣言されます。
純粋関数は引数に対して作用します。何も返さない関数は効率的ではありません。さらに、与えられた引数に対して常に同じ出力を返します。
例:
Function Pure(a,b) { return a+b; }
不純関数
不純関数は、純粋関数とは正反対のものです。入力や出力が隠されているため、不純関数と呼ばれます。不純関数は依存関係があるため、単独で使用したりテストしたりすることはできません。
例:
int z; function notPure(){ z = z+10; }
機能構成
関数合成とは、2つ以上の関数を組み合わせて新しい関数を作ることです。
共有状態
共有状態は、オブジェクト指向プログラミングにおける重要な概念です。基本的には、オブジェクトにプロパティを追加することです。例えば、ハードディスクがオブジェクトである場合、ストレージ容量やディスクサイズをプロパティとして追加できます。
副作用
副作用とは、呼び出された関数の外部で発生するあらゆる状態変化のことです。関数型プログラミング言語の最大の目標は、副作用をソフトウェアコードの他の部分から分離することで、副作用を最小限に抑えることです。関数型プログラミングでは、副作用をプログラミングロジックの他の部分から切り離すことが非常に重要です。
関数型プログラミングの利点
- コード内の紛らわしい問題やエラーを回避できます。
- 単体テストのテストと実行、関数型プログラミングのデバッグが容易になります Code.
- 並列処理と並行性。
- ホットコード展開とフォールトトレランス。
- より短いコードで、モジュール性を向上させます。
- 開発者の生産性向上。
- ネストされた関数をサポートします。
- Lazy Map や List などの関数型構造体
- ラムダ計算を効果的に利用できるようにする。
関数型プログラミングの制限
- 関数型プログラミングのパラダイムは容易ではないため、初心者には理解しにくい。
- コーディング中に多くのオブジェクトが変化するため、維持管理が難しい。
- 多くのモックアップと、広範な環境設定が必要です。
- 再利用は非常に複雑で、絶え間ないリファクタリングが必要となる。
- オブジェクトは問題を正しく表現していない可能性があります。
関数型プログラミングとオブジェクト指向プログラミング
| 関数型プログラミング | OOP |
|---|---|
| FP は不変データを使用します。 | OOP は可変データを使用します。 |
| 宣言型プログラミングに基づくモデルを採用しています。 | 命令型プログラミングモデルを採用しています。 |
| このプログラムが重視するのは、「あなたがプログラムで何をしているか」ということです。 | それが重点を置いているのは、「あなたがどのようにプログラミングを行っているか」ということです。 |
| 並列プログラミングをサポートします。 | 並列プログラミングはサポートされていません。 |
| その機能には副作用はありません。 | ある方法には多くの副作用が生じる可能性がある。 |
| フロー制御は、関数呼び出しと再帰を伴う関数呼び出しを使用して実行されます。 | フロー制御処理はループと条件文を用いて行われます。 |
| ステートメントの実行順序はあまり重要ではありません。 | ステートメントの実行順序は重要です。 |
| 「腹筋」と「腹筋」の両方をサポートしますtracデータに対する「tion」と「Abstrac行動よりも理論を優先する。 | 「Abs」のみをサポートtracデータに対する優位性」。 |


