Haskell のモナドの背後にある正確な代数と理論を理解していません。しかし、一般的に関数型プログラミングについて考えると、初期状態を取得し、次の状態を表すためにそのコピーを生成することによって状態がモデル化されるという印象を受けます。これは、あるリストが別のリストに追加される場合に似ています。どちらのリストも変更されませんが、3 番目のリストが作成されて返されます。
したがって、モナド操作を暗黙的に初期状態オブジェクトをパラメーターとして取り、暗黙的に最終状態オブジェクトを返すと考えるのは有効ですか? これらの状態オブジェクトは、プログラマーがそれらについて心配したり、アクセス方法を制御したりする必要がないように隠されます。したがって、プログラマーは 10 分前の IO ストリームを表すオブジェクトをコピーしようとはしません。
つまり、次のコードがある場合:
main = do
putStrLn "Enter your name:"
name <- getLine
putStrLn ( "Hello " ++ name )
... IO モナドと "do" 構文を、このスタイルのコードを表すものと考えてよろしいですか?
putStrLn :: IOState -> String -> IOState
getLine :: IOState -> (IOState, String)
main :: IOState -> IOState
-- main returns an IOState we can call "state3"
main state0 = putStrLn state2 ("Hello " ++ name)
where (state2, name) = getLine state1
state1 = putStrLn state0 "Enter your name:"