2012-02-29 4 views
5

私は関数型プログラミングの狂信者の多くは、にしがみつく特定の中核となる概念があることに気付きました:副作用なぜ機能プログラミングは良いですか?

を最小限に可変データ

  • を回避状態

  • を回避

    • は、

    • など...

    私は他のものが関数型プログラミングを行うのは不思議ではありませんが、なぜこれらのコアアイデアは良いのでしょうか?なぜ状態を避けるのが良いのですか?

  • 答えて

    11

    心配する余分な状態がない場合、あなたのコードは推論するのが簡単です。簡単なコードは簡単に保守することができます。コードを変更するために(関数のような)特定のコードの外にあるものについては心配する必要はありません。これはテストのようなものには本当に便利な結果をもたらします。コードがいくつかの状態に依存しない場合、そのコードの自動テストを作成する方が簡単です。何らかの状態の初期化について心配する必要がないからです。

    ステートレスコードを使用すると、共有されたデータを同時に変更/読み込みする2つの実行スレッドについて心配する必要がないため、スレッド化されたプログラムも簡単に作成できます。あなたのスレッドは独立したコードを実行することができ、これにより開発にかかる時間を節約できます。

    本質的に、状態を回避すると、より簡単なプログラムが作成されます。ある意味では、「動く部分」(すなわち、コードの行が相互作用できる)が少なくなるため、これは一般に、コードがより信頼性が高く、欠陥が少ないことを意味します。基本的には、コードが単純になればなるほど、間違ってしまうことは少なくなります。私にとって、これは状態のないコードを書く本質です。

    ステートレスな「機能的な」コードを作成する理由はたくさんありますが、それらはすべて私のためにシンプルになっています。

    +1

    おそらく並行性は正しく記述するのが簡単でしょうか? – ebaxt

    +0

    はい、追加しました。ありがとう。 :) – Oleksi

    +0

    +1。まあ、オレクシ。 –

    5

    @Oleksiが述べたことに加えて、参照透過性とトランザクションデータ構造というもう一つの重要なことがあります。もちろん、関数型プログラミング言語は必要ありませんが、少し簡単です。

    Purely functional data structuresは同一のままであることが保証されています。ある関数がツリーを返した場合、常に同じツリーになり、それ以降のすべての変換は新しいコピーを作成します。この方法で以前のバージョンのデータ構造に戻す方がずっと簡単です。これは多くの重要なアルゴリズムにとって重要です。

    5

    は非常に一般的に、関数型プログラミングの意味:

    • は(変更可能)状態

    なぜ突然変異が問題となるの使用を思いとどまら(ファーストクラス)機能

  • の使用を奨励しますか?それについて考えてみましょう:突然変異は、データ構造に何が流れを制御するかです。つまり、あなたは無秩序な形で完全に異なるものに任意にジャンプすることができます。したがって、時には有用ですが、ほとんどの場合、可読性、テスト容易性、および構成性に害を及ぼします。

  • +1

    +1とgotoを比較するための+1! – Ingo

    2

    代表的な機能の1つは、「サブタイプなし」です。

    • サブタイプの関係は、それほど明白ではない問題の集まりにつながります。これは、この機能を呼び出すために少し奇妙に聞こえるが、それは2つの理由である。あなたがシングルまたはミックスインの継承に限定されない場合、あなたはダイヤモンドの問題に終わります。より重要なのは、分散(共分散、反分散、不変性)に対処しなければならないことです。これは急速に悪夢になります。特に型パラメータ(ジェネリックa.k.a.ジェネリック)です。さらにいくつかの理由があります。また、OO言語でさえ、「継承よりも合成を優先します」というような文が聞こえます。
    • 一方、サブタイプを省略するだけで、あなたのタイプシステムについてはるかに精通していることがあります。ほとんどの場合、完全な型推論が可能です。通常、Hindley Milner型推論の拡張を使用して実装されます。

    もちろん、ハスケルのような言語では、この問題に対する良い答えが見つかりました:一般的な "インターフェース"(または "一般的な操作のセット" )を参照してください。オブジェクト指向言語との違いは、元の型定義に触れることなく、型クラスを「後で」定義できることです。サブタイプで行うことができる型クラスを使用すると、ほとんどすべてのことが可能になりますが、はるかに柔軟な方法で(型推論を防ぐことなく)行うことができます。そのため、他の言語でも同様のメカニズムが使用され始めています(例えば、C#とJava 8のScalaや拡張メソッドの暗黙的な変換など)

    関連する問題