以前の質問で、関数型プログラミング言語は物理エンジンなどの動的システムには適していないと言われています。これは、主にオブジェクトの変更にコストがかかるためです。このステートメントはどの程度現実的ですか、そしてその理由は何ですか
以前の質問で、関数型プログラミング言語は物理エンジンなどの動的システムには適していないと言われています。これは、主にオブジェクトの変更にコストがかかるためです。このステートメントはどの程度現実的ですか、そしてその理由は何ですか
回答:
HaskellとClojureはどちらも実際の可変性を許可しているため、そもそも問題ではありません。
さらに、「可変」データが、より大きな計算の一部として段階的に更新される中間値で構成されている場合、効率を上げるために可変性を必要としないこともあります。たとえば、Haskell では、ストリームフュージョンと呼ばれる手法に関して進行中の研究があります。これは、コンパイラが処理ループ、データプロデューサー、およびデータコンシューマーを融合して、中間データ構造を完全に排除するものです。
ここでのHaskellの主な問題は、怠惰です-大量の入力データと大量の出力データがあり、そのすべてが重要である数値計算プログラムでは、遅延は非常に少ない利点ですが、それでもオーバーヘッドを課します。Haskellでそのようなプログラムを書くことができないと言っているわけではありません(実際、人々はそうしています)が、それは言語の強みを生かしておらず、必要なパフォーマンスを得るために評価モデルをよりよく理解する必要があります。
そうは言っても、JVMの強みに対しては、大量の処理は機能しません。そのようなプログラムが、FORTRANがまだ存在する理由です。
Clojureについて話すことはできませんが、Haskellには非常に高度に調整されたIOパッケージが多数あり、必要なすべての変更が可能です。
ここに私が書いた質問への回答があります。誰かが最も一般的な3つの詳細を説明し、そのパフォーマンスを考慮します。https://stackoverflow.com/questions/15439966/when-why-use-an-mvar-over-a-tvar/15440286 #15440286
また、ここでは、IOを集中的に使用するアプリケーションであるWarpと呼ばれるHaskell Webサーバーのパフォーマンスメトリックを示す簡単なグラフも確認できます。
Haskellに関してはこれについて多くの混乱がありますが、実際には、IOをさまざまな方法で使用するためのハッキングに関する多くのパッケージを備えた素晴らしいIO機能があり、その多くは高度に調整されています。これが当てはまらないと人々が推測する理由は、HaskellがIOを他のすべてのものから分離するために非常に長い時間を費やしているためですが、それはパフォーマンス特性に影響を与えません。
ただし、パフォーマンス特性について説明すると、パフォーマンスが悪いと人々が認識するのは、遅延評価が原因で常に直感的とは限らない方法で動作するためです。ただし、これは、参照しているシステムなどの破壊的な更新を行うIOコンテキストで作業を開始するときに、それほど心配する必要のないものです。さらに、パフォーマンスの問題が発生すると、組み込みの機能を使用して、リソースの配置先を特定し、特定することで、多くの人が大きな助けになることに気づく傾向があります。
あなたが説明しているようなシステムを検討する価値のあるもう1つのモナドは、非常に小さなIO呼び出しによって行われる破壊的な更新のために特に優れたパフォーマンスを発揮するSTモナドです。
申し訳ありませんが、Clojureとは会話できません。詳細を教えていただければ幸いです。
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases