[GHC] #8953: Reification drops necessary kind annotations (was: Reifying poly-kinded type families misses kind annotations)

GHC ghc-devs at haskell.org
Tue Oct 21 14:09:01 UTC 2014


#8953: Reification drops necessary kind annotations
-------------------------------------+-------------------------------------
              Reporter:  goldfire    |            Owner:  goldfire
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Template    |          Version:  7.9
  Haskell                            |         Keywords:
            Resolution:              |     Architecture:  Unknown/Multiple
      Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple                   |       Blocked By:
       Type of failure:              |  Related Tickets:
  None/Unknown                       |
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 Still getting worse!

 Now, look at this:

 {{{
 a :: Proxy (Proxy :: * -> *)
 a = undefined

 b :: Proxy (Proxy :: (* -> *) -> *)
 b = undefined

 $( do info_a <- reify 'a
       info_b <- reify 'b
       runIO $ mapM putStrLn $ map pprint [info_a, info_b]
       return [] )
 }}}

 produces

 {{{
 Main.a :: Data.Proxy.Proxy Data.Proxy.Proxy
 Main.b :: Data.Proxy.Proxy Data.Proxy.Proxy
 }}}

 Yet, the types of `a` and `b` are ''not'' the same, and assigning one to
 the other rightly results in a type error.

 Furthermore, we really need to give the kind of ''every'' type variable
 binder. Consider

 {{{
 type StarProxy (a :: *) = Proxy a
 }}}

 Reifying tyvar binders omits any kinds that are `*`, yet the kind
 annotation here is very relevant (if `-XPolyKinds` is on).

 Oh, and the original problem (not reifying kind annotation on type
 variable patterns) can affect ''class'' instances, too, not just ''type''
 instances.

 So, new plan:
 1. Never reify a tyvar binder into a `PlainTV`. Always use `KindedTV`.

 2. Include a kind annotation (`SigT`) wrapping every use of a poly-kinded
 tycon. This wrapping will wrap around any arguments the tycon is applied
 to.

 3. If a class or family tyvar is polykinded, include a kind annotation on
 any pattern used to specialize this tyvar in instance declarations.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8953#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list