7

私はおそらくIOモナドをよく理解していません。

何ヶ月も実行されると予想されるアプリケーションを作成し、その進行状況をログに記録する場合、IOモナドは最後まですべてのログ情報をRAMに保持しますか?

IO Insideのブログから、Haskellは世界を次のようにモデル化しています

main :: RealWorld -> ((), RealWorld)

そのため、コードのHaskell部分の実行中にIOが発生するのではなく、アプリケーションがから戻ったときにのみ発生しますmain

私はおそらくこれを完全に誤解しています。Haskellが実際にIOを行うのはいつか誰かが説明できますか?

4

2 に答える 2

8

IOモナドは最後まですべてのログ情報をRAMに保持しますか?

いいえ。「IOモナド」をアクションを実行するものと考えるべきではありません。これは、命令型プログラムを表す数学的な方法にすぎません。原始的な命令型プログラムは次のようなものgetCharです。>>=2つのプログラムをより大きな命令型プログラムに接着するために使用されます。IOモナドは、すべての命令型プログラムのセットです。

次のようなプログラムを考えてみましょう

main = putStr "Hello, " >> putStrLn "world!"

つまりmain、はプログラムを実行するプログラムputStr "Hello, "であり、それが実行されると、プログラムを実行しputStrLn "world!"ます。Haskellインタプリタやコンパイルされたプログラムは、命令ポインタ、つまり「どこにいて、次に何を実行するか」を除いて、メモリ内に状態を保持する必要はありません。

RealWorld -> ((), RealWorld)メタファーは、外界の状態を完全に計算する必要のある新しい状態に変換することを意味しているように見えるため、混乱している可能性があります。その後、計算された状態を反映するように世界を更新できます。それはまったく起こりません。Haskell wikiはこれについて警告しています:

IOに関する次の話は、IOのいくつかの重要な側面(相互作用や並行性を含む)を実際に説明できないという点で正しくありません。

于 2012-06-04T12:01:43.917 に答える
4

IOモナドは最後まですべてのログ情報をRAMに保持しますか?

いいえ。賢明なロギング戦略を使用していると仮定します。

Haskellは、プログラムで結果が要求されたときにIOを実行します。ほとんどのアクションではすぐに実行されます。(例外は、データがプログラムによって使用されるまでファイルが必ずしも読み取られないレイジーファイル入力ライブラリです)。

于 2012-06-04T11:55:39.663 に答える