Concurrent Clean : 副作用について

Cleanを使うようになって、プログラムの中に2種類の流れがあることに気づいた。
1つは、実行モジュールが起動されてから、実行モジュールが終了するまで、順次実行される流れ。これは、外界と情報を交換し、その過程で外界に副作用を与える。
もう1つは、同じ入力に対しては常に同じ出力が得られる、一種の知能を表現する計算の流れ。これは副作用を持たず、プログラムのどの時点で呼び出されても、同じ結果を与える。
純粋関数型言語は、この後半を効率的に書くことが主眼になっているのだが、前半部分をどのように表現するべきかに、それなりに苦慮している。Haskellモナドを使うし、Cleanは一意型を使っている。
さらに、言語として、どのような方法が使えるかに加えて、プログラミングを行う上で、その部分をどのように書き上げるべきかということも、それなりに苦慮する部分になる。純粋関数型言語が実用化していくならば、この部分に、デザインパターンやコーディングルールなどが整備されていく必要があるのだろうと思う。
直感的には、副作用を持つ部分は、アプリケーションの浅い部分にまとめてしまって、深い部分は副作用のないコードにしておくのがよいように思うが、処理の流れを吟味しないと、メモリに計算結果を溜め込んでしまって、必要以上にメモリを消費するコードになってしまう可能性もある。また、外部記憶データへのアクセスを隠蔽したいときには、手続き型やオブジェクト指向での感覚だと深い部分に隠してしまうのが常套だが、純粋関数型の場合には、そのやり方はあまり上手くいかない。
このように考えを進めると、副作用の扱いは、プログラム全体のデザインのレベルにまで影響を与える問題だということになるし、ここから得た知見を通常の手続き型やオブジェクト指向のプログラミングにフィードバックすると、また、デザインについて考えることになる。