[GHC] #12466: Typechecker regression: Inaccessible code in a type expected by the context
GHC
ghc-devs at haskell.org
Thu Aug 25 00:51:31 UTC 2016
#12466: Typechecker regression: Inaccessible code in a type expected by the context
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner:
Type: bug | Status: new
Priority: highest | Milestone: 8.0.2
Component: Compiler (Type | Version: 8.1
checker) |
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 ekmett):
So am I correct in guessing that this causes us to fail for the
`Conjoined` class in `lens`?
I've stripped it down removing the superclasses here:
{{{#!hs
class Conjoined p where
conjoined :: ((p ~ (->)) => q (a -> b) r) -> q (p a b) r -> q (p a b) r
conjoined _ r = r
}}}
(This is just a noisier version of `Foo`.)
This is a rather big huge of the optimization story in `lens`, as we use
it to avoid fiddling around with updating indices when the user isn't
using them. This can make a 100x difference in performance for user code,
so it isn't a trivial thing to throw away. If this suddenly isn't legal
any more I'm really not sure what the heck we're going to do.
That said, I don't see how that statement is illegal. `conjoined` takes
two argument, one says _if_ you can tell me that p is (->) i'll give you a
thing. The other is unconditionally usable.
Once you learn p isn't `(->)` you simply can't use the first argument, as
you could never satisfy its precondition. It isn't an error on the behalf
of the signature of `conjoined`. It seems something is hinky in the way
we're judging who has incurred an obligation here and when.
We seem to be being far too eager to discharge an obligation we have no
reason to even look at. Until something tries to use the first argument,
why are we even doing anything with its constraints at all? The constraint
being unsatisfiable in this limited situation is very much the point of
the expression in the first place.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12466#comment:16>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list