[GHC] #15592: Type families without CUSKs cannot be given visible kind variable binders

GHC ghc-devs at haskell.org
Wed Oct 3 15:20:16 UTC 2018


#15592: Type families without CUSKs cannot be given visible kind variable binders
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.4.3
      Resolution:                    |             Keywords:
                                     |  TypeApplications, TypeFamilies,
                                     |  CUSKs
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:  14880             |             Blocking:
 Related Tickets:  #15591            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by RyanGlScott):

 By a series of strange coincidences, I ended up with almost exactly the
 same code as in comment:7 while working on this this morning. (Don't
 worry, I won't work on this any further until the dust has settled on
 #14880.) There's one thing I haven't worked out, though: how to make this
 work for associated types (in light of #15591). Consider:

 {{{#!hs
 class C a where
   type T (x :: f a)
 }}}

 Ideally, the kind of `T` would be:

 {{{#!hs
 T :: forall {k} (a :: k) (f :: k -> Type). f a -> Type
 }}}

 Alas, the code in comment:7 is not enough to accomplish this. It will
 instead give this as the kind for `T`:

 {{{#!hs
 T :: forall {k} {a :: k} (f :: k -> Type). f a -> Type
 }}}

 Note that `a` is now invisible. Ack.

 In order to fix this, we'd need to be aware of the fact that `a` is
 mentioned explicitly in `C` within `kcTyClGroup`. Currently, `kcTyClGroup`
 doesn't have access to this information, however.

 Another gotcha is that if you only use the code in comment:7, it'll cause
 some programs to no longer typecheck. In particular, this program:

 {{{#!hs
 class C a where
   type T (x :: (f :: k -> Type) a)
 }}}
 {{{
 Bug.hs:8:3: error:
     • These kind and type variables: (x :: (f :: k -> Type) a)
       are out of dependency order. Perhaps try this ordering:
         k (a :: k) (f :: k -> *) (x :: f a)
       NB: Implicitly declared variables come before others.
     • In the associated type family declaration for ‘T’
   |
 8 |   type T (x :: (f :: k -> Type) a)
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 }}}

 I'm unclear if this is desirable or not.

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


More information about the ghc-tickets mailing list