これらの利点はすべて欠点でもあるからです。
ステートレスプログラム; 副作用なし
実社会のプログラムはすべて副作用と突然変異についてです。ユーザーがボタンを押すのは、何かを起こしたいからです。彼らが何かをタイプするとき、彼らはその状態が以前そこにあった状態を置き換えたいと思っています。会計のジェーン・スミスが結婚し、彼女の名前をジェーン・ジョーンズに変更するとき、彼女の給料を印刷するビジネスプロセスをサポートするデータベースは、その種の変異を処理することすべてに優れているべきです。エイリアンに機関銃を発射するとき、ほとんどの人はそれを、ヒットポイントの少ない新しいエイリアンの構築として精神的にモデル化しません。彼らはそれを既存のエイリアンの特性の突然変異としてモデル化します。
プログラミング言語の概念がモデル化されるドメインに対して根本的に機能する場合、その言語を使用することを正当化することは困難です。
並行性; 増加するマルチコアテクノロジーで非常に優れた再生
問題はただ押しのけられます。不変のデータ構造を使用すると、古いデータを処理する可能性を犠牲にして、スレッドの安全性が低下します。可変データ構造を使用すると、データの整合性を保つために複雑なロジックを記述する必要があるという犠牲を払って、常に新しいデータに取り組むという利点があります。これらのいずれかが明らかに他よりも優れているわけではありません。
プログラムは通常短く、場合によっては読みやすくなります
長くて読みにくい場合を除きます。関数形式で書かれたプログラムの読み方を学ぶことは難しいスキルです。人々は、プログラムを一連の計算を実行するよりも、レシピのように実行する一連のステップとして考える方がはるかに優れているようです。
生産性が上がる(例:Erlang)
機能的なスタイルでプログラミングする方法を知っているプログラマーを雇うことの莫大な費用を正当化するために、生産性は大幅に上昇しなければなりません。
また、稼働中のシステムを捨てたくはないことを覚えておいてください。ほとんどのプログラマーは、新しいシステムをゼロから構築するのではなく、既存のシステムを維持しています。そのほとんどは、非関数型言語で構築されています。それを株主に正当化することを想像してみてください。何百万ドルもの費用をかけて既存の給与計算システムを廃棄して新しいシステムを構築したのはなぜですか?「関数型プログラミングは素晴らしいので」と株主を喜ばせることはまずありません。
命令型プログラミングは非常に古いパラダイムであり(私の知る限り)、21世紀にはおそらく適さない
関数型プログラミングも非常に古いものです。コンセプトの時代がどのように関連しているかはわかりません。
誤解しないでください。私は関数型プログラミングが大好きです。関数型プログラミングの概念をC#に取り入れることを支援したかったので、このチームに参加しました。不変のスタイルでのプログラミングが未来の道だと思います。しかし、単純に望めない関数型のプログラミングには莫大なコストがかかります。より機能的なスタイルへの移行は、数十年の間にゆっくりと徐々に起こります。そして、それはそれが何であるかです:Haskellの純粋さと美しさの放棄とC ++の放棄を受け入れるのではなく、より機能的なスタイルへのシフト。
私は生活のためにコンパイラを構築しており、次世代のコンパイラツールの機能的なスタイルを確実に採用しています。これは、関数型プログラミングが基本的に私たちが直面しているこの種の問題に適しているためです。私たちの問題はすべて、生の情報(文字列とメタデータ)を取り込み、それらを異なる文字列とメタデータに変換することです。誰かがIDEで入力しているように、変更が発生する状況では、問題のスペースは本質的に、変更されたツリーの部分のみを増分的に再構築するなどの機能的手法に役立ちます。多くのドメインにはこれらの優れたプロパティがないため、機能的なスタイルに明らかに従うことができます。