
#11341: Reifying a GADT doesn't tell you the correct return type -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 8.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by jstolarek): Currently reifying a GADT data constructor tells us "what the user meant", not "what the user wrote", ie. type synonyms are expanded. I think the most important question is what should the GADT data constructor representation look like. I believe that TH should represent source code syntax. That said, your third example shows that the current representation is not sufficient. So I would propose to represent GADT data constructor as: {{{#!hs data Con = ... | GadtC [Name] [StrictType] Type }}} Where `Type` is the result type written by the user. In `TcSplice.reifyDataCon` we have access to `dcOrigResTy` field of a `DataCon`, which should allow us to reify original result type. {{{#!hs data T a where MkT :: a -> T a }}} Note that by ''result type'' of `MkT` I mean `T a`, not `a -> T a`. (I believe `dcOrigResTy` stores the latter). In this setting I don't think it is a good idea to store indices inside `GadtC`. This would duplicate information already stored inside the constructor and make it possible to create inconsistent data constructors. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11341#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler