STM パッケージを使用して並列マルチコア ブランチ アンド バウンド アルゴリズムを実装した課題のレポートを書いているところですが、直面した問題がありました。
STM を使用する実装は、STM の「アトミック」とコンカレントの「forkIO」の両方を使用するため、明らかに IO モナドにありますが、決定論的です。共有メモリ変数の使用にもかかわらず、関数の最終結果は常に同じ入力に対して同じになります。
私の質問は、「unsafePerformIO」以外に、IO から抜け出すためのオプションは何ですか? 複数のコアを使用すると、決定論に対して同じ保証がない他の並行コードに影響を与える可能性があるため、IOモナドからそれを取得しようとする必要があります。
Par モナド パッケージのことは聞いたことがありますが (使用したことはありません)、STM は IO モナドに存在し、スレッド セーフなグローバル変数を取得するために、STM に代わる唯一の方法は MVars (私が知っていること) です。 IO モナドにも存在します。