Concurrent Clean : 一意型の型変換

[id:syd_syd:20070624:p1]
一意型と非一意型の間にはサブタイプ関係があって、例えば、

Start :: (Int, Int)
Start = (a, a)
  where
    a = unique

unique :: *Int
unique = 1

というプログラムは、暗黙的に'*Int'から'Int'に型変換されるため、合法です。(関数の宣言に現れる'[u <= w]'という記法は、そのようなサブタイプ関係を記述するための記法です)
で、この暗黙の型変換を読み間違えて、型エラーになったときのエラーメッセージがひどいのです。
[id:lethevert:20061004:p1]
[id:lethevert:20070506:p1]
って、悪いことばかり言っていてもなんですが・・・。
ただ、これらの型エラーは、Cleanプログラミングのお作法みたいなのを作っていけば、回避できるようになるのじゃないかと、最近は考えるようになってきました。