関数型プログラミングの定義

関数型プログラミングの定義は非常に簡単です。関数型プログラミングは、数学関数を使用したプログラミングです。それだけですか?もちろん違います!

数学関数

関数型プログラミングは、数学関数を使用したプログラミングです。 私は、あなたはすでにそれを推測していると思います。この定義の鍵は、式の数学関数です。数学関数は、同じ引数を指定すると毎回同じ結果を返す関数です。無限大のルックアップ テーブルのように動作します。

参照透過性

関数 (式) が同じ引数を指定すると常に同じ結果を返すという特性は、参照透過性 と呼ばれます。 .参照透過性は広範囲に影響します:

  • 数学関数は副作用を持つことができないため、関数本体の外側で状態を変更することはできません。
  • 関数呼び出しはその結果に置き換えることができますが、順序を変更したり、別のスレッドに配置したりすることもできます。
  • プログラム フローは、一連の命令ではなく、データの依存関係によって定義されます。
  • 数学関数は、関数を分離して推論できるため、リファクタリングとテストがはるかに簡単です。

それは非常に有望に聞こえます。しかし、非常に多くの利点がありますが、大きな制限があります。数学関数は外の世界と話すことができません。例?

数学関数はできません

  • ユーザー入力を取得するか、ファイルから読み取る
  • のコンソールにファイルに書き込みます。
  • 戻り値が異なるため、乱数または時間を返します。
  • 国家を築く

数学関数のおかげで、汎関数の定義は非常に簡潔ですが、あまり役に立ちません。重要な問題はまだ残っています。関数型プログラミングで何か有用なものをどのようにプログラミングできますか?数学関数は、外界との通信を持たない島のようなものです。または、Haskell の生みの親の 1 人であるサイモン ペイトン ジョーンズの言葉を借りれば。数学関数が持つことができる唯一の効果は、部屋を暖めることです。

ここで、もう少し詳しく説明します。関数型プログラミング言語の特徴は?

関数型プログラミング言語の特徴

Haskell は、関数型プログラミングの特徴を巡るツアーで大いに役立ちます。

ハスケル

Haskell を使用する理由は 2 つあります。

<オール>
  • Haskell は純粋な関数型プログラミング言語であるため、Haskell を使用することで関数型プログラミングの特性を十分に学ぶことができます。
  • Haskell は、過去 10 ~ 15 年間で最も影響力のあるプログラミング言語かもしれません。
  • 私の 2 番目のステートメントには証拠が必要です。 Python、特に C++ については、次の投稿で提供します。そのため、Java、Scala、および C# について簡単に説明します。

    • もう 1 人の Haskell の父である Philip Wadler は、Java のジェネリックの実装者の 1 人でした。
    • Scala の父であり、Haskell から多くのことを取り入れた Martin Odersky も、Java でのジェネリックの実装に関与しました。
    • Erik Meijer は、Haskell の熱心な崇拝者であり、研究者でもあります。彼は Haskell のモナドの概念を使用し、有名な C# ライブラリ LINQ を作成しました。

    私も一歩先へ進みます。関数型プログラミング、特にHaskellをどのように知っているか、主流のプログラミング言語が今後数年間でどのように発展するかを知っています。 純粋な でも Java のようなオブジェクト指向言語は、機能的なアイデアの圧力に耐えることができません。 Java にジェネリックとラムダ式が追加されました。

    しかし、ここで私の主題に戻ります。関数型プログラミング言語の特徴は?

    特性

    機能的特性の検索で、7 つの典型的な特性を特定しました。これらがすべての特性であってはならず、各関数型プログラミング言語がそれらをサポートする必要はありません。しかし、この特性は、関数型プログラミングの抽象的な定義を理解するのに大いに役立ちます。

    グラフィックは、一方では関数型プログラミングの特徴を示し、他方では私の次の投稿の概要を示しています。 Haskell、C++、および Python で多くの例を提供します。しかし、7 つの特徴は何を意味するのでしょうか?

    一流の関数 関数型プログラミング言語の典型です。これらの関数は、関数を引数として受け入れるか、関数を返すことができます。したがって、関数は高階関数でなければなりません .つまり、データのように動作します。 純粋関数 同じ引数が指定された場合は常に同じ結果を返し、副作用はありません。これらが、Haskell が純粋関数型言語と呼ばれる理由です。純粋関数型言語には不変データしかありません .つまり、カウンタに基づく while または for ループを持つことはできません。ループの代わりに、再帰を使用します .関数型プログラミングの主な特徴は、関数を簡単に作成できることです。これは、パンとバターのデータ構造 list によるものです。 .式がその引数をすぐに評価する場合、貪欲または熱心な評価と呼ばれます。式が引数のみを評価する場合、必要に応じて、遅延評価と呼ばれます .評価された式が必要ない場合、遅延評価は時間とメモリを削減します。私は、あなたはすでにそれを推測していると思います。古典的なプログラミング言語は貪欲です。彼らはすぐに式を評価します。

    次は?

    次の投稿では、ファーストクラスの関数から始めます。 C++ の初期からあります。