web-dev-qa-db-ja.com

Haskell / Clojureは、実際には粒子シミュレーションなどの動的システムには適していませんか?

以前の質問で、関数型プログラミング言語は物理エンジンなどの動的システムには適していないと言われました。これは、主にオブジェクトを変更するのにコストがかかるためです。このステートメントはどれほど現実的ですか、そしてなぜですか?

9
MaiaVictor

HaskellとClojureはどちらも実際の可変性を許可しているため、そもそも問題ではありません。

さらに、「可変」データが、より大きな計算の一部として段階的に更新される中間値で構成されている場合、効率を上げるために可変性を必要としないこともあります。たとえば、Haskellでは、コンパイラが処理ループ、データプロデューサ、およびデータコンシューマを融合して中間データ構造を完全に排除するstream fusionと呼ばれる手法に関する研究が進行中です。

ここでのHaskellの主な問題は、怠惰です-大量の入力データと大量の出力データがあり、それらすべてが重要である数値計算プログラムでは、遅延は非常に少ない利点ですが、それでもオーバーヘッドがかかります。 Haskellでそのようなプログラムを書くことができないと言っているわけではありません(実際、人々はそうしています)が、それは言語の強みを生かしておらず、必要なパフォーマンスを得るために評価モデルをよりよく理解する必要があります。

そうは言っても、重い数の処理はJVMの強みにも影響しません。そのようなプログラムが、FORTRANがまだ存在する理由です。

10
C. A. McCann

Clojureについて話すことはできませんが、Haskellには非常に高度に調整された多くのIOパッケージがあり、必要なすべての変更を可能にします)と言えます。

ここに私が書いた質問への回答があります。誰かが最も一般的なものを3つ詳しく説明し、それらのパフォーマンスを考慮します: https://stackoverflow.com/questions/15439966/when-why-use-an-mvar-over-a -tvar/15440286#15440286

こちら ワープと呼ばれるHaskell Webサーバーのパフォーマンスメトリックを示す簡単なグラフもご覧いただけます。これは、非常に集中的なアプリケーションですIO.

Haskellに関してこれについては多くの混乱がありますが、真実は、IOを使用するためのハッキングに関する多くのパッケージを備えた設備があり、IO方法、その多くは高度に調整されています。人々がこれが当てはまらないと推測する理由は、Haskellが他のすべてからIOを分離するために非常に長く取り組んでいるためですが、それは性能特性。

しかし、パフォーマンス特性について説明すると、パフォーマンスが悪いと人々が認識する理由は、遅延評価が原因で常に直感的とは限らない方法で動作するためです。ただし、これは、参照しているシステムなどで破壊的な更新を行うIOコンテキストで作業を開始するときに、それほど心配する必要のないものです。さらに、パフォーマンスの問題が発生している場合、組み込みの機能を使用して、リソースの配置先を特定および特定し、非常に役立ちます。

あなたが説明しているようなシステムを見る価値のあるもう1つのモナドは STモナド であり、これは特に、非常に小さなIO呼び出しによって実行される破壊的な更新用であり、優れたパフォーマンスを提供します。

申し訳ありませんが、Clojureとは会話できません。詳細を教えていただければ幸いです。

8
Jimmy Hoffa