GADT Strangeness

Dominic Steinitz dominic.steinitz at
Sat Jan 3 03:00:31 EST 2009

Simon Peyton-Jones wrote:
> | If I remove -XScopedTypeVariables from this
> then | I get the following error message: | | >
> Asn1cTestNew.hs:55:27: | >     GADT pattern match in non-rigid
> context for `INTEGER' | >       Solution: add a type signature | >
> In the pattern: INTEGER | >     In the definition of
> `referenceTypeAndValAux2': | >         referenceTypeAndValAux2 ns
> INTEGER x | >                                   = lhs ns <> text " =
> " <> text (show x) <> semi | > Failed, modules loaded: Language.ASN1,
> ASNTYPE. | | At the very least the message is unhelpful. It was only
> by accident I | decided to put in -XScopedTypeVariables.
> This one had me puzzled for a while too! Here is what's happening.
> You have three mutually recursive functions: referenceTypeAndValAux1 
> referenceTypeAndValAux2 cSEQUENCE In Haskell 98, typechecking
> mutually recursive functions is done *together*, with each having a
> momomorphic type in the other RHSs.  That leads to an annoying
> problem, that of figuring out how their polymorphic type variables
> "match up".  As a result, even the type variables in the type
> signature look non-rigid.
> The solution is to use -XRelaxedPolyRec, which compiles
> mutually-recursive definitions that each have a type signature one by
> one.  Precisely because of the above infelicity, both -XGADTs and
> -XScopedTypeVariables imply -XRelaxedPolyRec.

Thanks very much for this. I would never have guessed to use
-XRelaxedPolyRec given the error message.

Is it worth noting it here
or is it something that has always existed with GADTs and I just didn't
trip over it?

> This is a nasty corner I agree.  GHC requires -XGADTs for you to
> *define* a GADT. Perhaps it should also require -XGADTs for you to
> *match against* one (as you are doing here).  That would avoid this
> particular hole.  If you think that would be a step forward, do put
> forward a Trac feature request, and encourage others to support it.

I would vote for this. In fact I was mildly surprised I could use GADTs
without specifying -XGADTs.

I noticed that Isaac Dupree has already raised a ticket so
I will add my support to it.

Many thanks and a happy new year, Dominic.

More information about the Glasgow-haskell-users mailing list