ghc 6.7 and GADT pattern-matching

Simon Peyton-Jones simonpj at microsoft.com
Wed Aug 22 10:27:18 EDT 2007


The issue is this.  When doing GADT matching, getting type inference to work well, and interact well with other features (e.g. indexed type families) is MUCH easier if the type being matched is totally known - we say "rigid".  When you used "$" you made GHC less sure about the type of the GADT match.    Our GADT paper describes this rigidity reasoning http://research.microsoft.com/~simonpj/papers/gadt/index.htm

GHC 6.6 was a bit more liberal, but the liberality was delicately balanced, and made life too complicated when we added more stuff.

In any case, the solution is always "add a type signature", though in this case you could also escape with "omit a $".

Simon

From: cvs-ghc-bounces at haskell.org [mailto:cvs-ghc-bounces at haskell.org] On Behalf Of Conal Elliott
Sent: 22 August 2007 06:15
To: cvs-ghc at haskell.org
Subject: ghc 6.7 and GADT pattern-matching

In going from ghc-6.6 to ghc-6.7, I've lost some GADT pattern matching that I'd really like to have back. The message:

    c:/conal/Haskell/Eros/src/gadt-example.hs :23:32:
    GADT pattern match in non-rigid context for `:*'
      Tell GHC HQ if you'd like this to unify the context
    In the pattern: a :* b
    In a lambda abstraction: \ (a :* b) -> ((f a) :* b)
    In the second argument of `($)', namely
        `\ (a :* b) -> ((f a) :* b)'

and the relevant code:

    -- | Statically typed type representations
    data Ty :: * -> * where
      (:*)   :: Ty a -> Ty b -> Ty (a, b)
      (:->)  :: Ty a -> Ty b -> Ty (a->b)
      OtherTy :: TypeRep -> Ty a

    -- | Type transformations
    newtype TyFun a b = TyFun { unTyFun :: Ty a -> Ty b }

    instance Arrow TyFun where
      TyFun f >>> TyFun g = TyFun (f >>> g)
      first  (TyFun f) = TyFun $ \ (a :* b) -> (f a :* b)
      second (TyFun g) = TyFun $ \ (a :* b) -> (a :* g b)

Full test module attached with many more example matchings.

I'd really like to get this code working in ghc-6.7.  How likely is that?  The best alternative I know is *much* less readable.

Thanks,  - Conal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/cvs-ghc/attachments/20070822/1d8bc949/attachment.htm


More information about the Cvs-ghc mailing list