[GHC] #11348: Local open type families instances ignored during type checking

GHC ghc-devs at haskell.org
Wed Jan 6 09:23:40 UTC 2016


#11348: Local open type families instances ignored during type checking
-------------------------------------+-------------------------------------
        Reporter:  alexvieth         |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1-rc1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 You are so productive!  But before generating a big patch, let's agree the
 design and approach.

 Thanks for comment:4; I think I get it now.  Here's another way to say it;
 see if you agree.

 * When kind-checking a type declaration, we must obviously first check the
 declarations of any types it mentions.  E.g.
 {{{
 type S = Int
 type T = S -> S
 }}}
   We must kind-check `S` before `T` because `T` mentions `S`.

 * But we may also need to check a `type instance` declaration:
 {{{
 type family F (a :: k) :: Type
 type instance F Int = Bool

 data K a = MK (F Int)
 type R = MK 'True
 }}}
   In the declaration of `R`, the (promoted) data constructor `MK` is given
 an argument of kind `Bool`, but it expects one of kind `F Int`.  Things
 only work if we have processed the `type instance` declaration first.

 * Alas, there is no ''explicit'' dependency of the declaration of `R` on
 the `type instance` declaration.  Indeed we might also have
 {{{
 type instance F R = ...blah...
 }}}
   and we can't check ''that'' instance until after dealing with `R`.

 * Bottom line: we have to interleave processing of type/class decls with
 processing of `type instance` decls.

 So I think the algorithm must be this: '''always process a `type instance`
 declaration as soon as all the type constructors it mentions have been
 kind-checked'''.

 Algorithmically, we can't just add the `type instance` declarations to the
 strongly-connected component analysis for type/class decls, because of the
 lack of explicit dependencies.  I think we have to

 * Do SCC on the type and class declarations as now
 * Keep in hand the set of un-processed `type instance` declarations
 * Before doing a type/class SCC, first process all the `type instance`
 decls whose free vars are imported, or are now bound in the type
 environment.
 * That results in a depleted set of un-processed `type instance`
 declarations.

 Does that sound right?  Is it what your patch does?

 Incidentally this couldn't happen before `TypeInType` because previously
 we didn't promote data types like `K`.
 {{{
 Foo.hs:9:10:
     Data constructor ‘MK’ comes from an un-promotable type ‘K’
     In the type ‘MK True’
 }}}

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


More information about the ghc-tickets mailing list