[GHC] #15322: `KnownNat` does not imply `Typeable` any more when used with plugin

GHC ghc-devs at haskell.org
Fri Jun 29 08:47:12 UTC 2018


#15322: `KnownNat` does not imply `Typeable` any more when used with plugin
-------------------------------------+-------------------------------------
        Reporter:  chshersh          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.3
      Resolution:                    |             Keywords:
                                     |  typeable,knownnat
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #10348            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * cc: diatchki (added)


Comment:

 #15322

 Does this need the plugin to demonstrate the bug?  It complicate
 reproduction, and indeed I'm not sure how to set up the plugin.

 ------------

 I do know a bit about what's going on.  I think this bug is a consequence
 of this patch
 {{{
 commit c41ccbfa8aaeb99dd9a36cb3d99993f0fa039cdc
 Author: Simon Peyton Jones <simonpj at microsoft.com>
 Date:   Tue Sep 26 15:02:09 2017 +0100

     Omit Typeable from the "naturally coherent" list

     In doing something else (Trac #14218) I tripped over the
     definition of "naturally coherent" classes.  This patch

     - Cocuments properly what that means

     - Removes Typeable from the list, because now we know what
       it meams, Typeable clearly doesn't belong.

     No regressions.

     (Actually the term "naturally coherent" seems a bit off.
     More like "invertible" or something.  But I left it.)
 }}}
 The issue here is this.  We have
 {{{
   [G] Typeable n   [G] KnownNat n
   [W] Typeable (n+1)
 }}}
 Can we use `TcInteract.doTyLit` to simplify the `[W]` goal, by
 instead generating `[W] KnownNat (n+1)`?  GHC does not do so,
 because suppose we had instead got:
 {{{
  [G] Typeable x
  [G] Typeable (F [x])
 }}}
 where `type family F (x::Nat) :: Nat`.   Now we don't want to do
 the `doTyLit` thing because then we'd be stuck... we'd have
 `[W] KnownNat (F [x])` with no way to solve it.

 Instead, by deferring that choice, GHC is hoping that later we'll
 reduce `F [x]  -->  x` and bingo we'd have `[W] Typeable x` which we
 can solve from the Given.  Background info: this "deferring" business is
 implmented by this code in `TcInteract`:
 {{{
 matchClassInst dflags inerts clas tys loc
 -- First check whether there is an in-scope Given that could
 -- match this constraint.  In that case, do not use any instance
 -- whether top level, or local quantified constraints.
 -- ee Note [Instance and Given overlap]
   | not (xopt LangExt.IncoherentInstances dflags)
   , not (naturallyCoherentClass clas)
   , let matchable_givens = matchableGivens loc pred inerts
   , not (isEmptyBag matchable_givens)
   = do { traceTcS "Delaying instance application" $
            vcat [ text "Work item=" <+> pprClassPred clas tys
                 , text "Potential matching givens:" <+> ppr
 matchable_givens ]
        ; return NotSure }
 }}}

 Returning to the example, I'm pretty suspicous of the whole `doTyLit`
 thing (introduced by Iavor in Trac #10348).  It seems to say that
 really the ''only'' way to solve `Typeable (ty :: Nat)` is by proving
 `KnonwNat ty`, which seems to me like replacing a simple goal with a
 complicated one.

 One possible workaround for you may be to remove the `Typeable n`
 constraint
 since it is (I think) mysteriously implied by `Typeable` (c.f. Trac
 #10348).
 I say "mysteriously" because `Typeable` is not a superclass of `KonwnNat`.

 Iavor, I'm a bit lost here.

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


More information about the ghc-tickets mailing list