web-dev-qa-db-ja.com

IOモナドの批評は、世界で動作している状態モナドと見なされている

HaskellのIOモナドは、状態が世界である状態モナドとして説明されることがよくあります。したがって、タイプ_IO a_モナドの値はworldState -> (a, worldState)のようなものと見なされます。

しばらく前に、私はこの見解を批判し、それが正しくないいくつかの理由を挙げた記事(またはブログ/メーリングリストの投稿)を読みました。しかし、私は記事も理由も覚えていません。誰か知ってる?

編集:記事が失われたようですので、ここでさまざまな引数を収集してみましょう。私は始めています物事をより面白くするための賞金。

編集:私が探していた記事は 厄介な分隊への取り組み:モナディック入力/出力、並行性、例外、およびHaskellでの外国語呼び出し によるサイモン・ペイトン・ジョーンズ。 (TacTicsの回答に感謝します。)

46
Petr Pudlák

IO a = worldState -> (a, worldState)の問題は、これがtrueの場合、forever (putStrLn "Hello") :: IO aと_undefined :: IO a_が等しいことを証明できることです。 dolio(2010、irc)の好意による証明は次のとおりです。

_forever m
 =
m >> forever m
 =
fix (\r -> m >> r)
 = {definition of >> for worldState -> (a, worldState)}
fix (\r -> \w -> r (snd $ m w))
_

補題:_(\r w -> r (snd $ m w)) ⊥ = ⊥_

_(\r w -> r (snd $ m w)) ⊥
  =
\w -> ⊥ (snd $ m w))
  =
⊥ . snd . m
  =
⊥
_

したがって、forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥

特に、forever (putStrLn "Hello") = ⊥、したがってforever (putStrLn "Hello")undefinedは同等のプログラムです。ただし、明らかに、それらは理論上または実際上、同等のプログラムとは見なされません。

このモデルは、同時実行を呼び出さなくても間違っていることに注意してください。

33

ささいな答えは次のとおりです。状態モナドの状態の変更は、モナドで実行されたアクションによるものです。実際に「WorldState->(a、WorldState)」の説明が同じプロパティを主張している場合、WorldStateはIOモナドのみが変化する純粋な値であり、それは間違っています。時間は変化し、ファイル、ハンドルの状態などは、IOモナドで何が発生するかとは無関係に変化する可能性があります。それがIOモナドです。GHCがRealWorld値(またはw/eだった)の下を通過することは、私が知る限り、物事が順番に実行されることを保証することです(それがST値に入れられるだけの可能性があります)。

12

私は、IOをあなたの言語のランタイムシステムと通信する非対称コルーチンの形式としてモデル化する方法についてのトピックをブログ投稿しました(確かにシリーズの第3部です)。

http://comonad.com/reader/2011/free-monads-for-less-3/

その投稿は、「世界を通過する」ことの意味論について推論することがなぜ厄介なのかを少しカバーしています。

12
Edward KMETT

厄介な分隊への取り組み を参照してください。

大きな理由は、IOモナドのRealWorld状態モデルが同時実行ではうまく機能しないことです。この読みやすいクラシックでは、SPJは操作上のセマンティクスを使用して理解しています。

8
TacTics

RealWorld状態モデルに関する主な不満は、TacTicsが言うように、ワールドパッシングは必ずしも同時実行性で動作するとは限らないということです。しかし、Wouter SwierstraとThorsten Altenkirchは、同時並行性を「世界を通過する」効果として推論する方法を示しました。論文「Beauty in the Beast:A Ukward Squad for A Functional Sematics」のインターリーブスレッドの固定で任意のシーケンスを使用します。 http://www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf

これに対応するコードはIOSpecとしてHackageにあります: http://hackage.haskell.org/package/IOSpec

Wouterの論文はより詳細になると思います: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf

5
sclv