Concurrent Clean とインターフェース

[id:lethevert:20050907:p1]
一意性の問題は、以下のようにして解決しました。

//** 型クラス = インターフェース の定義 **/
class FileIO a
where
    save :: *File a -> *File
IFileIO = E.a:
{ val :: a , save :: *File -> *(a -> *File) } castFileIO :: a -> IFileIO | FileIO a castFileIO x = { val = x , save = save } instance FileIO IFileIO where save f {val, save} = save f val

意味はよく分かっていませんが、こう書くのがCleanに必要だということなのでしょう。
ところで、この部分は、型クラスから自動的に導出できるはずなので、簡単な補助ツールを作ると、便利かなと思います。
暇なときに作って、CleanのIDEにマージしておこうかな。(いつ暇になるのかという問題はありますが・・・)