gadt changes in ghc 6.10

Daniel Gorín dgorin at
Wed Oct 15 14:21:16 EDT 2008

Hi, Simon

Thanks a lot for your mail. It turns out I could have resolved this by  
myself (with the help of this thread 
, to be honest). What I was missing was this key part:

> bind :: forall a b t. W t a -> (a -> W t b) -> W_ t b
> ------- the forall brings a,b,t into scope inside bind

So, while I had turned on the ScopedTypeVariables extension, none of  
the type variables in question was actually in scope. How embarrassing!

I can't blame anyone but me for this but, anyway, I feel that it may  
have helped me if the introduction of Section 8.7.6 of the user manual  
were a little more explicit about this. Although the example reads  
"f :: forall a. [a] -> [a]", and the text below says "The type  
signature for f brings the type variable into scope", the role of the  
"forall" is not mentioned until Section (and since I already  
knew what the extension was about, and was only looking for the proper  
extension name, I didn't make it that far :))

Also, since you are always willing to get examples of confusing error  
messages, I wanted to bring this one into attention:

> In your case the error message was:
> GADT.hs:26:56:
>    GADT pattern match with non-rigid result type `Maybe a'
>      Solution: add a type signature
>    In a case alternative: I1 m' -> m'
>    In the expression: case w' S of { I1 m' -> m' }
>    In a case alternative: Wrap w' -> case w' S of { I1 m' -> m' }

This is when ScopedTypeVariables is off. Now, what I found very  
confusing at first is that I thought the "a" in 'Maybe a' was  
referring to the "a" in 'W t a -> (a -> W t b) -> W_ t b', and I  
couldn't see how that could be happening. Once ScopedTypeVariables is  
on, one gets 'GADT pattern match with non-rigid result type `Maybe  
a1'" and everything makes more sense :)

And maybe the "add a type signature" can be more explicit? Like "add a  
type signature that makes the type of the result known at the matching  
point". Just a suggestion...

> I hope this helps. I'm still trying to find a really good way to  
> explain the reasoning here.  Do pls  augment the wiki page with what  
> you have learned!

I've put some of this in the "Upgrading packages" wiki, and added a  
link to the previous thread which I found to be very clear.

Thanks again!


More information about the Glasgow-haskell-users mailing list