IOモナドが世界で動作する状態モナドと見なされているという批判


46

IOHaskellではモナドは、多くの場合、状態は世界でStateモナドとして説明します。したがって、IO aモナド型の値はのようなものと見なされますworldState -> (a, worldState)

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

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

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



@JoachimSauerありがとう、興味深い記事でもありますが、私が探しているものではありません。その一つは、世界のパラダイムに焦点を当てていました。
ペトルプドラク

私の頭の上から、コメントここでは良いスタートです
アダム

1
この文脈で「世界」とはどういう意味ですか?「地球」という意味ではないと思います。何らかのグローバルスコープですか?これを書いた著者は空売りしている。彼が読者の自我を同時に混乱させ、つぶしたいなら、彼はそれを「国家は宇宙」または「神の国家」と呼ぶべきです。世界。パー!あなたの若い人たちは最近、十分に高い志を抱いていません!
グレンペターソン

2
参照してくださいstackoverflow.com/a/7072217/100020
sdcvvc

回答:


33

問題IO a = worldState -> (a, worldState)は、これが真実だった場合、それを証明できforever (putStrLn "Hello") :: IO aundefined :: 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同等のプログラムです。ただし、明らかに、理論上または実際上、同等のプログラムと見なされることは想定されていません。

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


7
終了しないプログラムがundefinedHaskellの純粋なセマンティクスと同等であることに誰もが驚いていますか?Haskellの純粋なセマンティクスでは、異なる⊥を区別できないはずです!しかし、プログラムについて運用上考えるときIOは、関与していない場合でも、さまざまな種類のdistinguishも区別したいと考えています。私はあなたがそれらは、彼らが両方⊥していることを証明することにより、同等であることを証明することができたとしても、私のプログラムが例外をスローするか、無限ループに入っているかどうかを気に。ただし、実際には矛盾ではありません。
ベン

3
⊥と[0,1 ..]の表示は、どちらも「非終了」ですが、区別されます。違いは、⊥が非終了および非生産的計算を示すのに対して、[0,1 ..]は非終了的で生産的であることです。(永遠に(putStrLn "Hello"))同様の終了しないが生産的な表記があると予想されます。
ラッセルオコナー14

1
しかし、確かにforever (putStrLn "Hello")好き[0,1..]ではありません。あなたの証明はに特有ではないworldStateので、通常の状態モナドにも適用されます。だから、forever (someModificationWith "Hello")また⊥するdenotationally同等です。私はその結果にまったく驚いていません。それ表示的意味論で生産的ではなく、永遠に待機している間にコンピューターが動作していることは無関係です。同じことforever (putStrLn "Hello"); それは私たちが何とか怠ziに消費できる新しい世界の状態を生成しないし生成すべきではありません。
ベン14

明示的な世界状態の受け渡しを使用してIOの宣言モデルを提供するMercuryやCleanなどのプログラミング言語は根本的に間違っていますか?
ベン14

@Benは、ワールドパッシングが並行性でどのように機能するかについて言及していますか?Mercuryの並行性のロゼッタコードを見ましたか?私はそれが意味論的にも何を意味するのか疑問に思っています。
CMCDragonkai

12

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


8
それは実際には問題ではありません。固定されているが認識できないルールストアから派生したワールド状態への変更を実行するようにバインド操作をモデル化できます。
sclv

1
@sclv:はい、これ不可知の固定が、ルールストアがIOになり差別化要因であるない状態モナドを、この矛盾は、状態モナドでは見られない
ジミー・ホッファ

WorldState状態に対して聞いた議論は同時実行性に関連していますが、正確な議論を思い出すことはできません。しかし、それでも、WorldStateは未来を同様にエンコードできると仮定しているので、まだ問題は実際には見えません。もちろん、何かが足りないと思います。
トーマスエディング

@JimmyHoffa:状態のルールストアを持ち歩くことができます。
sclv

1
@JimmyHoffa:これは抽象化の目的です。また、私の最初のコメントをフォローアップするために、クリーンはIOを明示的かつ幸福に世界を通過するものとしてモデル化し、一意性タイプを使用して、世界をごまかし、「複製」しないようにします。これは、抽象化を実施する1つの方法です。
sclv

12

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

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

その投稿では、「世界を通過する」というセマンティクスについて推論するのが難しい理由の一部を説明しています。


+1-特に興味深い。私が設計している言語のIOをこれと同様の方法で実装することを長い間考えていたからです。:)
ジュール

8

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

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


これは私が探していたオリジナルの記事、主にセクション3.1であると思います。質問を編集する前にあなたがそれを投稿していたなら、私はあなたの答えを受け入れたでしょうが、今は、他の人が投稿するすべてのアイデアを見るために、最後まで待つのがより公平だと思います。
ペトルプドラク

5

RealWorld状態モデルに関する主な不満は、TacTicsが言うように、ワールドパスが必ずしも並行性で機能するとは限らないことです。しかし、Wouter SwierstraとThorsten Altenkirchは、論文「Beauty in the Beast:A Functional Sematics for the Awkward Squad」で、インターリーブスレッドの固定された任意のシーケンスを使用して、並行性を「世界を通過する」効果として推論する方法を示しました: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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.