Concurrent Clean : スコープ付き型変数
昨日あたりから、CleanのMLで型変数についての議論が続いている。
問題となっているのは、次の関数が型エラーになる所。
f :: a -> a f x = y where y :: a y = x
yに付けられた型が問題で、これをコメントアウトすればコンパイルエラーにはならない。
これは、Cleanでは、型変数は自分自身の関数定義の中でしか通用しないせいで、yに付けられたaという型が、実際のxの型よりも広いために起こっている。
さらに、yに対して、明示的に適切な型をあたえることができない。そのためには、スコープ付き型変数が必要になるが、Cleanはそれを表現する方法がない。
Cleanでプログラミングしているとちょくちょくぶつかる問題で、なれるまで混乱するところでもある。