さっきのコード見ると分かるけど、Clean は純粋関数型言語なんだけど、IOモナドは使っていない。 *World -> World の「」がミソで、一意型というのを使って副作用を安全に扱えるようにしている。http://d.hatena.ne.jp/quox/20080809/p4 の2chからのコピペの説明が一番簡潔な気がする。
そもそもIOを扱うって目的だけならIOモナドは要らなくて、World型を何らかの形で可視化して矛盾なく扱えれば十分なはず。Haskellでモナドを使ってあり難いのは、IO型のコンビネータとしてモナドが優れているってだけの話じゃないかな。確かAllowでもIO型は表現できた記憶があるし。ってのが素人目で見た(かなりいい加減な)感想。
##参考
ググってもいい資料見つけにくかったのでメモ。いずれも書かれた時期が古いかも。