関数型プログラミングは宣言的なパラダイムです。 FPの強みの1つは、副作用が回避されることです。一部の問題についてはFPは適切ではないということです.
関数型プログラミングが適していない一般的な問題は何ですか?
本質的に非常にステートフルなアプリケーション。ビデオゲームは実世界をモデル化しているため、良い例です。何かが変化するたびに以前の状態から再構築するのではなく、世界の状態を変更することを考えることははるかに理にかなっています。
具体的な例としては、撃たれた後のモンスターの体力の変化があります。単にヘルスが低下していることを除いて、すべての点で同じであるまったく新しいモンスターに置き換えるよりも、単にヘルスを変更する方がはるかに賢明です。これらの種類の変更はゲームの世界のほぼすべてを構成し、これを純粋な機能的な方法で行うことはあまり直感的ではありません。少なくとも純粋に関数型の言語で実行している場合は、パフォーマンスが大幅に低下する可能性があると思います。
(補足として、ゲームの一部の問題は、AIなどの関数型プログラミングに非常に適しています。関数型/命令型のハイブリッド言語は、これらのケースに最適です。)
リアルタイムエンベデッドプログラミングはすべて副作用に関するものです。デジタルおよびアナログIO、タイマー、シリアルポートおよびパラレルポートと相互作用することで、すべての興味深いことは、副次効果を持つ関数を呼び出すことによって行われます。
GUIプログラミングは関数型プログラミングには適していないと私は主張します。 GUIは一般に非常にステートフルであり、副作用なしで使用するよりも状態を使用してモデル化/管理する方がはるかに簡単です。 GUIに関数型プログラミング言語を使用することは確かに可能ですが、それはおそらく良いアイデアではありません。
別の回答で述べたように、ゲームは状態を追跡することで管理しやすくなることが多く、関数型言語でゲームを作成することはcanしながら、「ステートフル」言語で行う方が簡単で効率的であることがよくあります。 (つまり、オブジェクト指向言語)。
データ駆動型のビジネスアプリケーション。ユーザーインターフェイスと単純なデータ操作にはFPは必要ありません。
関数型プログラミング自体に適していないため、問題セットを簡単に却下することはできません。
関数型プログラミングに使用される実際の言語とその機能に大きく依存します。
その一例が、リアルタイム組み込みシステム向けの前述のErlangです。
状態がいっぱいであることも関数型プログラミングの良い基準ではありません。関数型プログラミング言語で実装されているいくつかの成功する方法がこれに対処しています。
関数型プログラミングに対する副作用もしばしば言及されます。完全に独占的でないプログラムはすべて副作用があります。したがって、すべての現実の世界FP言語はこれに対処する方法をいくつか持っています。これは、世界の副作用をカプセル化するためにどれほどエレガントに行うかという問題だけです。
グローバル変数のような任意の副作用はまったく必要ありません。
しかし、問題の見慣れた方法にあまり影響を与えないため、関数型プログラミングを簡単に実行できる問題セットがあります。しかし、いったん機能的に考えることができれば、より多くの問題セットがより少ない副作用を受け入れるようになります。
Cをプログラミングする場合でも、グローバル変数などの任意の副作用をできるだけ減らすことは常に良い考えです。