これは「正しい」答えを出すのに少し哲学的ですが、大丈夫です。
私の意見では、問題はFPとOOが並置されているとみなすために発生しますが、そうではありません。FPと命令型プログラミングは並置されています。つまり、式を使用するのではなく、ステートメントを使用するのです。
問題の一部は、とにかく私の意見では、OOが明確な定義を欠いていることです。これをサポートするために、「実際には「オブジェクト指向」という用語を作成しました。C++を念頭に置いていなかったと言えます」と言ったアラン・ケイを指していますが、ほとんどの言語はOO、つまりjava / C#と見なされます。 smalltalkよりもC++の後に多くを取ります。
OO C ++ / java / C#スタイルが提供するのは、コードをモデルに編成したり、データを作成したり、プロパティを追加したりするための優れた方法です。これは実質的に機能せず、関数型プログラミングでうまく使用できます。
多くのC++/ java / C#はステートフルである傾向がありますが、そうである必要はありません。javaとC#はどちらも、文字列クラスなどの不変の基本タイプを持っています。本当のJavaとC#では、不変のクラスを簡単に作成することはできませんが、少しの努力でそれを行うことができます。
不変の適切な場所に私たちを導くのはどれですか?私の設計では、通常、すべてを不変にすることから始めます。これにより、修正が容易になるためです。これによりパフォーマンスの問題が発生する場合は、クリティカルパスに可変性を追加し始めます。不変性が機能しない場所の1つは、GUIコントロールです。これには、通常、不変にはあまりにも多くの状態が含まれています。不変の「コンビネータ」アプローチを使用してGUIを構築するのにかなり長い道のりを得ることができると言った後、可変のGUIコントロールによって解釈されます。これは多かれ少なかれWebSharperの人がしていることです:http://www.intellifactory.com/products/wsp/Home.aspx
FP / OOの議論のためのもう一つの素晴らしいリソースは、Brainの「関数型プログラミングはコードの構造にどのように影響しますか?」です。(これはFP / OOについての私の考え方に大きな影響を与えました):http://lorgonblog.wordpress.com/2008/09/22/how-does-functional-programming-affect-the-structure-of-your-code/