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