Proposal: Automatic derivation of Lift

Simon Peyton Jones simonpj at microsoft.com
Tue Sep 8 12:03:05 UTC 2015


|  I don't think there's any fundamental reason why unboxed fields
|  prevent a Generic instance, as long as we're happy that unboxed values
|  will be re-boxed in the generic representation. It simply seems as if

Interesting and quite reasonable idea, as an extension to `deriving(Generic)`.

Make a ticket?

Simon

|  -----Original Message-----
|  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
|  Andres Loeh
|  Sent: 08 September 2015 13:00
|  To: Ryan Scott
|  Cc: GHC developers
|  Subject: Re: Proposal: Automatic derivation of Lift
|  
|  I don't think there's any fundamental reason why unboxed fields
|  prevent a Generic instance, as long as we're happy that unboxed values
|  will be re-boxed in the generic representation. It simply seems as if
|  nobody has thought of implementing this. As an example, consider the
|  following hand-written example which works just fine:
|  
|  {-# LANGUAGE MagicHash, KindSignatures, PolyKinds, TypeOperators,
|  TypeFamilies #-} module GenUnboxed where
|  
|  import GHC.Exts
|  import GHC.Generics
|  import Generics.Deriving.Eq
|  
|  data UPair = UPair Int# Char#
|  
|  instance Generic UPair where
|    type Rep UPair = K1 R Int :*: K1 R Char
|    from (UPair x y) = K1 (I# x) :*: K1 (C# y)
|    to (K1 (I# x) :*: K1 (C# y)) = UPair x y
|  
|  instance GEq UPair
|  
|  test :: Bool
|  test = let p = UPair 3# 'x'# in geq p p
|  
|  Cheers,
|    Andres
|  
|  On Mon, Sep 7, 2015 at 10:02 PM, Ryan Scott <ryan.gl.scott at gmail.com>
|  wrote:
|  > Unlifted types can't be used polymorphically or in instance
|  > declarations, so this makes it impossible to do something like
|  >
|  >     instance Generic Int#
|  >
|  > or store an Int# in one branch of a (:*:), preventing generics from
|  > doing anything in #-land. (unless someone has found a way to hack
|  > around this).
|  >
|  > I would be okay with implementing a generics-based approach, but
|  we'd
|  > have to add a caveat that it will only work out-of-the-box on GHC
|  8.0
|  > or later, due to TH's need to look up package information. (We could
|  > give users the ability to specify a package name manually as a
|  > workaround.)
|  >
|  > If this were added, where would be the best place to put it? th-
|  lift?
|  > generic-deriving? template-haskell? A new package (lift-generics)?
|  >
|  > Ryan S.
|  >
|  > On Mon, Sep 7, 2015 at 3:10 PM, Matthew Pickering
|  > <matthewtpickering at gmail.com> wrote:
|  >> Continuing my support of the generics route. Is there a fundamental
|  >> reason why it couldn't handle unlifted types? Given their relative
|  >> paucity, it seems like a fair compromise to generically define lift
|  >> instances for all normal data types but require TH for unlifted
|  types.
|  >> This approach seems much smoother from a maintenance perspective.
|  >>
|  >> On Mon, Sep 7, 2015 at 5:26 PM, Ryan Scott
|  <ryan.gl.scott at gmail.com> wrote:
|  >>> There is a Lift typeclass defined in template-haskell [1] which,
|  >>> when a data type is an instance, permits it to be directly used in
|  a
|  >>> TH quotation, like so
|  >>>
|  >>>     data Example = Example
|  >>>
|  >>>     instance Lift Example where
|  >>>       lift Example = conE (mkNameG_d "<package-name>"
|  >>> "<module-name>" "Example")
|  >>>
|  >>>     e :: Example
|  >>>     e = [| Example |]
|  >>>
|  >>> Making Lift instances for most data types is straightforward and
|  >>> mechanical, so the proposal is to allow automatic derivation of
|  Lift
|  >>> via a -XDeriveLift extension:
|  >>>
|  >>>     data Example = Example deriving Lift
|  >>>
|  >>> This is actually a pretty a pretty old proposal [2], dating back
|  to
|  >>> 2007. I wanted to have this feature for my needs, so I submitted a
|  >>> proof-of-concept at the GHC Trac issue page [3].
|  >>>
|  >>> The question now is: do we really want to bake this feature into
|  GHC?
|  >>> Since not many people opined on the Trac page, I wanted to submit
|  >>> this here for wider visibility and to have a discussion.
|  >>>
|  >>> Here are some arguments I have heard against this feature (please
|  >>> tell me if I am misrepresenting your opinion):
|  >>>
|  >>> * We already have a th-lift package [4] on Hackage which allows
|  >>> derivation of Lift via Template Haskell functions. In addition, if
|  >>> you're using Lift, chances are you're also using the
|  >>> -XTemplateHaskell extension in the first place, so th-lift should
|  be suitable.
|  >>> * The same functionality could be added via GHC generics (as of
|  GHC
|  >>> 7.12/8.0, which adds the ability to reify a datatype's package
|  name
|  >>> [5]), if -XTemplateHaskell can't be used.
|  >>> * Adding another -XDerive- extension places a burden on GHC devs
|  to
|  >>> maintain it in the future in response to further Template Haskell
|  >>> changes.
|  >>>
|  >>> Here are my (opinionated) responses to each of these:
|  >>>
|  >>> * th-lift isn't as fully-featured as a -XDerive- extension at the
|  >>> moment, since it can't do sophisticated type inference [6] or
|  derive
|  >>> for data families. This is something that could be addressed with
|  a
|  >>> patch to th-lift, though.
|  >>> * GHC generics wouldn't be enough to handle unlifted types like
|  >>> Int#, Char#, or Double# (which other -XDerive- extensions do).
|  >>> * This is a subjective measurement, but in terms of the amount of
|  >>> code I had to add, -XDeriveLift was substantially simpler than
|  other
|  >>> -XDerive extensions, because there are fewer weird corner cases.
|  >>> Plus, I'd volunteer to maintain it :)
|  >>>
|  >>> Simon PJ wanted to know if other Template Haskell programmers
|  would
|  >>> find -XDeriveLift useful. Would you be able to use it? Would you
|  >>> like to see a solution other than putting it into GHC? I'd love to
|  >>> hear feedback so we can bring some closure to this 8-year-old
|  >>> feature request.
|  >>>
|  >>> Ryan S.
|  >>>
|  >>> -----
|  >>> [1]
|  >>> http://hackage.haskell.org/package/template-haskell-
|  2.10.0.0/docs/La
|  >>> nguage-Haskell-TH-Syntax.html#t:Lift
|  >>> [2]
|  >>> https://mail.haskell.org/pipermail/template-haskell/2007-
|  October/000
|  >>> 635.html [3] https://ghc.haskell.org/trac/ghc/ticket/1830
|  >>> [4] http://hackage.haskell.org/package/th-lift
|  >>> [5] https://ghc.haskell.org/trac/ghc/ticket/10030
|  >>> [6] https://ghc.haskell.org/trac/ghc/ticket/1830#comment:11
|  >>> _______________________________________________
|  >>> ghc-devs mailing list
|  >>> ghc-devs at haskell.org
|  >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
|  > _______________________________________________
|  > ghc-devs mailing list
|  > ghc-devs at haskell.org
|  > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at haskell.org
|  http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


More information about the ghc-devs mailing list