>>512
あー、そうか。

ええっと、
do
 c1<-getChar
 c2<-getChar

let (c1, w1) = (getChar w0)
in
 let (c2, w2) = (getChar w1)
 in
 ...
が「同じだ」と言ってるわけではないぞ。

do
 c1<-getChar
 c2<-getChar
で「コマンド列」というlazy listが作られる。
このときにはまだwを引数にして呼び出したりしないし、
副作用も起きない。

そのコマンドを1個1個呼び出していくプログラムはシステム側にある。

Cの例で言えば、Robotがlazy listをたぐりながらコマンドを1つずつ
得て、コマンドを実行していく。その過程では当然副作用が起きる。

でも、>>501 で書いたCのプログラムでコマンド列を作っている部分
には副作用なんかないだろ?