Scoped type variables

Keean Schupke k.schupke at
Fri Dec 17 14:37:00 EST 2004

what about having -fno-lexically-scoped-types for old code?


Simon Peyton-Jones wrote:

>OK, OK, I yield!
>This message is about lexically scoped type variables.  I've gradually
>become convinced that if you write
>	f :: [a] -> [a]
>	f x = <body>
>then the type variable 'a' should be in scope in <body>.   At present in
>GHC you have to write
>	f (x :: [a]) = <body>
>to bring 'a' into scope. 
>I've fought against this because it seems funny for a 'forall' in a type
>signature to bring a type variable into scope in perhaps-distant
>function body, but it's just so convenient and "natural".  Furthermore,
>as Martin Sulzmann points out, you might have type variables that are
>mentioned only in the context of the type:
>	g :: Foo a b => [a] -> [a]
>	g = ...
>GHC provides no way to bring 'b' into scope at the moment, and that
>seems bad design.
>If I do this, which I'm inclined to, it could break some programs,
>because (with -fglasgow-exts) all type signatures will bring scoped type
>variables into scope in their function body.  Here's an example that
>will break
>	f :: [a] -> [a]
>	f x = my_id x
>	   where
>	       my_id :: a -> a
>	       my_id y = y
>The type signature for my_id will become monomorphic, since 'a' is now
>in scope, so the application (my_id x) will fail saying
>	can't unify 'a' with '[a]'.  
>In some ways that makes sense.  If you used 'b' instead in the defn of
>my_id, it'd be fine, because my_id would get the type (forall b. b->b).
>Fixing such breakages is easy.
>So there it is.   Any one have strong opinions?  (This is in addition to
>the existing mechanism for bringing scoped type variables into scope via
>pattern type signatures, of course.)
>Glasgow-haskell-users mailing list
>Glasgow-haskell-users at

More information about the Glasgow-haskell-users mailing list