私は関数型プログラミングの狂信者の多くは、にしがみつく特定の中核となる概念があることに気付きました:副作用なぜ機能プログラミングは良いですか?
を最小限に可変データを回避状態
を回避
は、
など...
私は他のものが関数型プログラミングを行うのは不思議ではありませんが、なぜこれらのコアアイデアは良いのでしょうか?なぜ状態を避けるのが良いのですか?
私は関数型プログラミングの狂信者の多くは、にしがみつく特定の中核となる概念があることに気付きました:副作用なぜ機能プログラミングは良いですか?
を最小限に可変データを回避状態
を回避
は、
など...
私は他のものが関数型プログラミングを行うのは不思議ではありませんが、なぜこれらのコアアイデアは良いのでしょうか?なぜ状態を避けるのが良いのですか?
心配する余分な状態がない場合、あなたのコードは推論するのが簡単です。簡単なコードは簡単に保守することができます。コードを変更するために(関数のような)特定のコードの外にあるものについては心配する必要はありません。これはテストのようなものには本当に便利な結果をもたらします。コードがいくつかの状態に依存しない場合、そのコードの自動テストを作成する方が簡単です。何らかの状態の初期化について心配する必要がないからです。
ステートレスコードを使用すると、共有されたデータを同時に変更/読み込みする2つの実行スレッドについて心配する必要がないため、スレッド化されたプログラムも簡単に作成できます。あなたのスレッドは独立したコードを実行することができ、これにより開発にかかる時間を節約できます。
本質的に、状態を回避すると、より簡単なプログラムが作成されます。ある意味では、「動く部分」(すなわち、コードの行が相互作用できる)が少なくなるため、これは一般に、コードがより信頼性が高く、欠陥が少ないことを意味します。基本的には、コードが単純になればなるほど、間違ってしまうことは少なくなります。私にとって、これは状態のないコードを書く本質です。
ステートレスな「機能的な」コードを作成する理由はたくさんありますが、それらはすべて私のためにシンプルになっています。
@Oleksiが述べたことに加えて、参照透過性とトランザクションデータ構造というもう一つの重要なことがあります。もちろん、関数型プログラミング言語は必要ありませんが、少し簡単です。
Purely functional data structuresは同一のままであることが保証されています。ある関数がツリーを返した場合、常に同じツリーになり、それ以降のすべての変換は新しいコピーを作成します。この方法で以前のバージョンのデータ構造に戻す方がずっと簡単です。これは多くの重要なアルゴリズムにとって重要です。
は非常に一般的に、関数型プログラミングの意味:
なぜ突然変異が問題となるの使用を思いとどまら(ファーストクラス)機能
+1とgotoを比較するための+1! – Ingo
代表的な機能の1つは、「サブタイプなし」です。
もちろん、ハスケルのような言語では、この問題に対する良い答えが見つかりました:一般的な "インターフェース"(または "一般的な操作のセット" )を参照してください。オブジェクト指向言語との違いは、元の型定義に触れることなく、型クラスを「後で」定義できることです。サブタイプで行うことができる型クラスを使用すると、ほとんどすべてのことが可能になりますが、はるかに柔軟な方法で(型推論を防ぐことなく)行うことができます。そのため、他の言語でも同様のメカニズムが使用され始めています(例えば、C#とJava 8のScalaや拡張メソッドの暗黙的な変換など)
おそらく並行性は正しく記述するのが簡単でしょうか? – ebaxt
はい、追加しました。ありがとう。 :) – Oleksi
+1。まあ、オレクシ。 –