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