Concurrent Clean : unique type

MLで質問した奴に、3人から全く同じ内容の突込みを連続で受けていた。てか、投稿する前に、他の奴のメールを読めよ!
ところで、内容はちょっと面白いので、ここにコピーしておく。

関数と定数

(詳しくは
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap3.html#sc12
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap10.html#sc7
を参照)

Start = (a,f 1 a,f 2 a)
where
   f :: !Int *{#Int} -> *{#Int}
   f i t
   #! t0 = t.[0]
   = {t & [0] = t0 + i}
a :: *{#Int}
a = {i \\ i <- [0..9]} 

こう書くと、aは関数として扱われてしまうので、コンパイルしても一意型エラーが起こらない。

Start = (a,f 1 a,f 2 a)
where
   f :: !Int *{#Int} -> *{#Int}
   f i t
   #! t0 = t.[0]
   = {t & [0] = t0 + i}

   a :: *{#Int}
   a = {i \\ i <- [0..9]}

これでも、aは関数と扱われて、一意型エラーは起こらない。(これは正しい動作?)

Start = (a,f 1 a,f 2 a)
where
   f :: !Int *{#Int} -> *{#Int}
   f i t
   #! t0 = t.[0]
   = {t & [0] = t0 + i}

   //a :: *{#Int}
   a = {i \\ i <- [0..9]}

これなら、aは局所グラフ(定数)と扱われるので、一意型エラーが起こる。

Start = (a,f 1 a,f 2 a)
where
   f :: !Int *{#Int} -> *{#Int}
   f i t
   #! t0 = t.[0]
   = {t & [0] = t0 + i}
a :: *{#Int}
a =: {i \\ i <- [0..9]}

これなら、aは大域グラフ(定数)と扱われるので、一意型エラーが起こる。

一意なレコードの定義

これはダメ。

Pos = *{t :: *{Int}}

こっちが正解。

*Pos = {t :: *{Int}}

配列の更新

配列の更新は、一意な配列に対してしか行うことができない。
http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap3.html#sc35