[GHC] #9123: Need for higher kinded roles
GHC
ghc-devs at haskell.org
Fri May 23 10:07:39 UTC 2014
#9123: Need for higher kinded roles
-------------------------------------+------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by ekmett):
{{{
newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }
}}}
This means that when you go to describe the instance for `Representational
(StateT s m)` it needs to convert `s -> m (a, s)` into `s -> m (b, s)`
given a coercion between a and b.
But that means we're coercing `(,) a` into `(,) b` -- let's call those f
and g respectively -- and we're expanding that with the coercion from s
into s which is trivial.
If we can't lift `(Representable f, Coercion f g, Coercion a b)` into
`Coercion (f a) (g b)` but can only go `(Representable f, Coercion a b) =>
Coercion (f a) (f b)` then we get stuck, as we only have `(Representable
((,) a), Coercion ((,) a) (,) b, Coercion s s)`!
For state you could actually get by with a _different_ weaker rule added
to the one Richard offered:
{{{
ext :: forall (f :: x -> y) (g :: x -> y) (a :: x). Coercion f g ->
Coercion (f a) (g a)
}}}
which I fake with `unsafeCoerce` right now in
https://github.com/ekmett/roles/blob/master/src/Data/Roles.hs
But that isn't enough to handle lifting a coercion where what 'a' occurs
on both sides of the nested, which is what you get for free monads, cofree
comonads, etc.
The simplest case that fails is probably:
{{{
newtype Pair a = Pair (a, a)
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9123#comment:13>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list