[GHC] #8516: Add (->) representation and the Invariant class to GHC.Generics

GHC ghc-devs at haskell.org
Sun Aug 14 20:28:26 UTC 2016


#8516: Add (->) representation and the Invariant class to GHC.Generics
-------------------------------------+-------------------------------------
        Reporter:  nfrisby           |                Owner:
            Type:  feature request   |               Status:  new
        Priority:  low               |            Milestone:
       Component:  Compiler (Type    |              Version:  7.7
  checker)                           |
      Resolution:                    |             Keywords:  Generics
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by nfrisby):

 Ryan, this looks very promising! I think this snippet presents the idea
 clearly, if I understand correctly. Please confirm.

 {{{#!hs

 -- | We suspect higher-order kinds (#9123) would supplant this typeclass.
 class RoleIsRep f where
   mapCoerce :: Coercible a b => f a -> f b

 data T f a = T (f [a])

 instance RoleIsRep f => Generic1 (T f) where
   type Rep1 (T f) =
     D1 ('MetaData "T" "module" "package" 'True)
       (C1 ('MetaCons "T" 'PrefixI 'False)
         (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness
 'DecidedLazy)
           (f :.: Rec1 [])))
   from1 (T x) = M1 (M1 (M1 (Comp1 (mapCoerce x))))
   to1 (M1 (M1 (M1 x))) = T (mapCoerce (unComp1 x))
 }}}

 Note that this is a performance improvement in some cases to boot!

 And your observation is that if we can define a lawful `Functor f` then we
 can define `RoleRep f`, right?

 Can we anticipate a time where a user would want these three things
 simultaneously: 1) a lawful `Functor f`, 2) a `nominal` role for `f`'s
 argument, and 3) an automatically derived `Generic1` instance? That's the
 only case where this would be "worse" for the user, I think.

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


More information about the ghc-tickets mailing list