[GHC] #9123: Need for higher kinded roles

GHC ghc-devs at haskell.org
Mon May 19 15:54:31 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 goldfire):

 I'm in support, generally, of Edward's suggestion on that thread. His idea
 does ''not'' go "all the way", in that there are some ideas we might want
 to express but cannot, as Edward points out. But, if the current roles
 story works for 95% of cases (where the `join` problem is an important
 member of the 5%), the current story + Edward's suggestion would probably
 cover 99.5%. And, the beauty of Edward's idea is that it is requires no
 change to Core and can mostly be implemented in user-land. GHC should
 support with magically-generated instances (like we already do for
 `Coercible`) and will need to incorporate these ideas into the `Coercible`
 solver, but these are relatively minor changes.

 Suppose that the class involved is named `Representational`, as Edward
 suggests. (I actually am against that name, because it makes the ''wrong''
 thing sound representational. But, let's leave bikeshedding over names
 until later.) Should we make `Representational` a superclass of `Functor`?
 It "makes sense" that every `Functor` should treat its argument
 representationally. And, doing so would make GND work trivially with the
 new `Monad`. And, doing so would make `Traversable` GND'able (it currently
 is not). But, of course, it would mean that users may want to write
 `Functor` instances that are ''not'' representational and now cannot. (For
 example,
 [https://github.com/ekmett/lens/blob/master/src/Control/Lens/Internal/Magma.hs#L73
 this one].)

 If we decide ''not'' to make `Representational` a (transitive) superclass
 of `Monad`, then `Monad` with `join` would only be GND'able if the GND
 instance has a `Representational` constraint in its context. This context
 could probably be inferred. But, any user writing a standalone GND for
 `Monad` (not an uncommon occurrence, I imagine) would have to be aware of
 this issue.

 These issues aren't meant to be "push-back" -- just some ramifications we
 should consider as we move forward.

 It is interesting to note that, had we gone with the POPL'11
 implementation of roles, which included support for "higher-kinded" roles,
 we would be even more stuck here. That implementation tied a role in with
 a type's kind, which means that we would be ''forced'' to make every
 `Monad` representational in order to get GND to work with `join`. With the
 current plan, we have this free design choice. The current roles story may
 be somewhat less powerful than roles in POPL'11, but they are surely more
 flexible.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9123#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list