data d = d (IO d)
これって再定義じゃないの?
参照透過性とかどうなってるの?