IOモナドは最後まですべてのログ情報をRAMに保持しますか?
いいえ。「IOモナド」をアクションを実行するものと考えるべきではありません。これは、命令型プログラムを表す数学的な方法にすぎません。原始的な命令型プログラムは次のようなものgetChar
です。>>=
2つのプログラムをより大きな命令型プログラムに接着するために使用されます。IOモナドは、すべての命令型プログラムのセットです。
次のようなプログラムを考えてみましょう
main = putStr "Hello, " >> putStrLn "world!"
つまりmain
、はプログラムを実行するプログラムputStr "Hello, "
であり、それが実行されると、プログラムを実行しputStrLn "world!"
ます。Haskellインタプリタやコンパイルされたプログラムは、命令ポインタ、つまり「どこにいて、次に何を実行するか」を除いて、メモリ内に状態を保持する必要はありません。
RealWorld -> ((), RealWorld)
メタファーは、外界の状態を完全に計算する必要のある新しい状態に変換することを意味しているように見えるため、混乱している可能性があります。その後、計算された状態を反映するように世界を更新できます。それはまったく起こりません。Haskell wikiはこれについて警告しています:
IOに関する次の話は、IOのいくつかの重要な側面(相互作用や並行性を含む)を実際に説明できないという点で正しくありません。