#9858: Typeable instance for datatype and its promoted constructor is the same -------------------------------------+------------------------------------- Reporter: dreixel | Owner: dreixel Type: bug | Status: new Priority: highest | Milestone: 7.10.1 Component: Compiler | Version: 7.9 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: None/Unknown | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by goldfire): I see two different issues at work here: 1. If we have `data A = A`, then (typeRep (Proxy :: Proxy A)) and (typeRep (Proxy :: Proxy 'A)) are equal. This is not a problem with kinds, but a problem with namespaces. To me, the salient difference between `A` and `'A` is not that their kinds are different, but that they represent totally different entities. Fixing this issue is simple, either by adding some namespace information to `TyCon` or putting some marker in the `tyConName` string. 2. If we have `data B x` (no constructors), then `B :: forall k. k -> *`. The types `(B :: Bool -> *)` and `(B :: Ordering -> *)` are actually, in Core, `B Bool` and `B Ordering` -- in Core, kind arguments are explicit. Thus, the `TypeRep` for `B :: Bool -> *` could feasibly be `TypeRep <fingerprint> <B's TyCon> [<Bool's TypeRep>]`. The change here isn't to the structure of `TyCon`, but instead mandating that all kind arguments are explicit in `TypeRep`s, just like they are in Core. Indeed, it surprises me that this isn't already the case! I believe that making kind arguments explicit in `TypeRep`s will be a simplification. Personally, it seems adding kind information to `TypeRep` is not the best approach here. -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9858#comment:19> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler