[GHC] #9123: Need for higher kinded roles
GHC
ghc-devs at haskell.org
Tue Dec 16 02:10:59 UTC 2014
#9123: Need for higher kinded roles
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: goldfire
Type: bug | Status: new
Priority: normal | Milestone: 7.12.1
Component: Compiler | Version: 7.8.2
Resolution: | Keywords:
Operating System: | Architecture: Unknown/Multiple
Unknown/Multiple | Difficulty: Project (more
Type of failure: | than a week)
None/Unknown | Blocked By:
Test Case: | Related Tickets:
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Comment (by goldfire):
Replying to [comment:30 simonpj]:
> You want to ''infer'' a rather complicated context. I don't know how to
do that.
Sure you do!
Currently, the code in !TcDeriv instructs the solver to try to reduce
certain constraints. This reduction results in an unsolved implication
constraint -- exactly the one we need to quantify over. The !TcDeriv code,
at this point, extracts out the flat (er... now called ''simple'')
constraints, checks to see if they're exotic, and then reports an error if
there are any exotic simple constraints or if there are any leftover
implication constraints. Currently, there's a leftover implication, and so
we report an error.
If, instead, we quantified over the leftover implication, we'd be done,
with an inferred implication constraint.
A separate question is whether or not this is desirable from a user's
standpoint. `deriving` quite rightly restricts what it will quantify over.
And implication constraints seem quite exotic. We could, though, say that
implication constraints aren't exotic. Or, we could bake in the particular
implication constraint `(forall a b. Coercible a b => Coercible (m a) (m
b))`, recognize that, rewrite it to use Simon's type synonym `RepArg1 m`,
and then it doesn't seem so exotic after all. That's terribly hacky, but
it just might be useful enough to do. Or, we could punt and require users
to write the constraint when they want it -- the error message will give
them guidance. I don't have a strong opinion in any direction here.
It is worth noting that, if `join :: m (m a) -> m a` is in `Monad`, most
GNDs of `Monad` would work today. The ones that trip up are when the
newtype wraps a monad transformer. That's a common-enough case that we
don't want to make it impossible, but a rare enough case that I'm OK with
making it annoying, if we can't do better.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9123#comment:31>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list