[GHC] #15347: QuantifiedConstraints: Implication constraints with type families don't work
GHC
ghc-devs at haskell.org
Fri Jul 27 13:33:07 UTC 2018
#15347: QuantifiedConstraints: Implication constraints with type families don't
work
-------------------------------------+-------------------------------------
Reporter: aaronvargo | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler (Type | Version: 8.5
checker) | Keywords:
Resolution: | QuantifiedConstraints
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 aaronvargo):
Replying to [comment:20 simonpj]:
> Not allowing functions in the instance head not to do with ambiguity;
it's to do with coherence
But is this an issue for QCs, which can't introduce incoherence? Does it
matter if two QCs might overlap, as long as locally we can't tell that
they do? Suppose we had:
{{{#!hs
type family F a = r | r -> a
type family G a = r | r -> a
foo :: forall b. (forall a. Eq (F a), forall a. Eq (G a)) => Dict (Eq (F
b))
foo = Dict
}}}
While `F b` and `G b` might overlap for some particular `b`, locally only
one instance can be used to solve `Eq (F b)`, since we don't know whether
`G b ~ F b`. Since the two instances are guaranteed to be coherent,
wouldn't it be fine to simply pick the one that matches? (If both were to
match then the program would still be rejected).
Likewise for the case with non-injective independent type families:
{{{#!hs
foo :: forall b. (forall t. C (F b) [t], forall t. C (G b) [t]) => Dict (C
(F b) [Int])
}}}
The first instance should just be used, since it's the only one that
matches given the knowledge available locally.
How does the compiler currently deal with type families in non-quantified
constraints? What makes it more difficult to allow them in QCs?
> Can you distil a small example that shows the utility of having a
function in the head?
For now I have no use case for the injective type family case, and only
really care about the independent family case. I'll try and come up with a
simpler example than the category one.
> So, maybe a quantified constraint with a function in the head is just
"parked", but it wakes up if the function can be reduced.
This is much less useful than what I want, though I suppose it might help
in some small minority of cases.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15347#comment:21>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list