Concurrent Clean : ChannelとHandle

状態の表現に関する一連のエントリ

と、遅延IOの一連のエントリ

を通して、ひとつの考え方がまとまってきた。
これまでファイルアクセス用オブジェクトはFileという1つのオブジェクトとして考えていたのだけれど、
これを通信用のChannelと制御用のHandleに分けて、データの送受信にはChannelを使い、通信路を閉じたりつなぎ替えたり設定変更したりするのはHandleという風に区別するのはどうだろう?
また、ChannelもHandleも、複製できてもよいのではないか? 一意型付けによって、一回使うと失効するという原則が守られていれば、同じ実体を指している複数のChannelやHandleがあっても、参照透過性に関しては問題ないはず。
このスキームが有効なのは、遅延IOのところの他に、ログの所でも有効だと思う。ログはいろいろな場所で取得するけれど、それによって関数呼び出しの構造を変化させたくないし、出力している内容とは無関係に出力先ファイルを切替えたいことがある。
ついでに、この抽象化をあらゆる入出力に適用すれば、統一感のあるライブラリになるなぁと思った。

      • -

当然、こういう風に分割すると、評価順序の制御が大変になるので、そこはもう少し上位のレイヤーで使い易い抽象化を付けてあげる必要がある。
Cleanは、評価順の制御がすごく柔軟な半面、それを理解して正しく利用するのがかなり難しいというのは無視できない欠点だよな。