Concurrent Clean: 一意性と抽象型と共変反変

いろいろ実験して、言語リファレンスを読んだ結果、一意性について理解が深まりました。
とりあえず、関数型と一意性の間には、通常の型のように共変反変の関係があります。

::R a b :== .(a -> b)

createR :: *Char -> *(R Int *Char)
createR c = (\i = c)

f :: u:(R Int *Char) -> u:(R *Int Char)
f r = r

Start = f (createR 'a')

というプログラムは有効なプログラムです。関数fのところで、共変反変の関係が見て取れます。
この結果、抽象型の場合には、共変反変の判断を付けることができないので、

::R

f :: *R -> R
f r = r

Start = f (createR 1 2 3)

というプログラムは、型エラーになります。