Concurrent Clean: 副作用があっても値を取り出さなければ(一定の条件下で)危険でなければ・・・

Haskellな人に質問ですけど、IO Monadで参照透明を担保しているのは、モナドそのものの機能ではなくて、IO Monadから値を取り出すことができないというところにあるのですよね。
ああ、いや、参照透明なら置換しても意味が変わらないはずで、IOの回数も変わってはいけないから、トップレベルしかIO Monadを処理できないところと値を取り出せないところの2つを組み合わせて、参照透明を担保しているというべきかな?
しかし、IOの回数と停止性の問題に興味がないとすれば、値を返さなければ副作用があっても危険なことは起こらないという認識はあってますよね。例えば、trace関数をそれほど危険なものとしては扱うことがないように。

      • -

とすれば、Cleanでは副作用を扱うところは常に一意型を用いるようにしているわけですが、回数と停止性の問題を許容すれば、一意型を持たないハンドルに対して値を返さない副作用をもつ操作を行うということを許してもよいという議論が成り立つかもしれない。
この議論がなんの役に立つかというと、プログラムの開始後にtraceの出力先を切替えるということを、ライブラリレベルで合法的に行う仕組みを作れるかもということです。高機能なログライブラリを作る場合、これができるかできないかはかなり重要な問題となると思うので。
(続く)