[GHC] #11523: Infinite Loop when mixing UndecidableSuperClasses and the class/instance constraint synonym trick.
GHC
ghc-devs at haskell.org
Thu Jul 5 07:27:10 UTC 2018
#11523: Infinite Loop when mixing UndecidableSuperClasses and the class/instance
constraint synonym trick.
-------------------------------------+-------------------------------------
Reporter: ekmett | Owner: simonpj
Type: bug | Status: new
Priority: high | Milestone: 8.4.1
Component: Compiler (Type | Version: 8.0.1-rc1
checker) | Keywords:
Resolution: | UndecidableSuperClasses
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: GHC rejects | Test Case:
valid program | polykinds/T11523
Blocked By: | Blocking:
Related Tickets: #11480 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
> What if you take instances into account in considering when to
terminate?
That's a very interesting point.
Currently, for each new "Given" (of which the potential superclasses are
an example), GHC
1. Rewrites it with currently available Given equalities, a kind of
normalisation step
2. And then sees if it is syntactically equal to one of the existing
Givens.
You are suggesting changing Step 2 to
2. See if it is ''completely provable from'' the existing Givens and top-
level instances
That is an intriguing thought. I say "completely" provable from because
suppose you had
{{{
instance (C a, D a) => D (T a)
[G] C a
}}}
and you were about to add `[G] D (T a)`. The instance declaration
applies, yielding sub-goals `(C a, D a)`. We have `(C a)`, but not `D a`.
So I think we then must abandon the attempt -- even if only one out of
hundreds of sub-goals fails -- and add the proposed new Given after all.
I worry a bit about solve order. In the original example, suppose we
added `[G] Category (Cod p)` ''before'' we added `Category p`. If we were
going to be solidly robust to solve order, whenever we added a new Given
we'd have to check all the ''existing'' Givens to see if any of them could
be proved from the new one (and the others).
But perhaps we could apply this magic only to the superclass expansion
step; for "normal" Givens it's at most an optimisation.
Interesting! I wonder if there are any other compelling examples.
Edward??
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11523#comment:29>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list