
Simon Peyton-Jones wrote:
In GHC at present, a separate type signature introduces no scoping. For example: f :: forall a. a -> a f x = (x::a) would be rejected, because the type signature for 'f' does not make anything scope over the right-hand side, so (x::a) means (x::forall a.a), which is ill typed.
OTH, `f x = (x::a)' will be accepted if this definition appears in an instance declaration, which mentions the type variable `a' somewhere in its `signature'. Incidentally, Hugs differs from GHC in that matter: Hugs considers type variables in an instance declaration just like type variables in a function signature -- having no effect on the local type variables. One might say that Hugs is more consistent in that matter -- OTH, GHC is more convenient, IMHO. The alternative
1b) It's brought into scope even if the forall is implicit; e.g. f :: a -> a f x = (x::a)
would seem therefore consistent with the existing behavior of GHC with respect to `instance signatures'.
2b) Get rid of result type signatures altogether; instead, use choice (1a) or (1b), and use a separate type signature
We can always emulate the result type signatures: that is, instead of writing foo a :: resType = body we can write foo a = result where result body and use "`asTypeOf` result" wherever we need to refer to resType. Or we can write foo a = result where result = cid result cid (_::resType) = body to reduce the result type signature to the argument type signature. OTH, I have personally used result type signatures on many occasions and found them quite helpful. I would be grateful if there were a way to keep them.