>>477
「getCharを呼ぶとCharが返ってくる」と思うと副作用に見えるかも知れない。
この解釈は間違い。

World型の値w(プログラマには見えないし触れない)があるとして、
(getChar w)を計算した結果、「状態が変わったw」と文字が得られる。

do
c<-getChar
putChar c

の実行を図にするとこんな感じ。

        World
         ↓
getChar  → コマンド → cの値
         ↓
putChar c → コマンド
         ↓
       変化したWorld

式で書くと
let (c,w2)=(getChar w)
in ((putChar c) w2)
みたいな感じ。