Concurrent Clean : スコープ付き型変数

昨日あたりから、CleanのMLで型変数についての議論が続いている。
問題となっているのは、次の関数が型エラーになる所。

f :: a -> a
f x = y
    where
        y :: a
        y = x

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