Proposal: Lifting to TExpQ

Michael Sloan mgsloan at
Sat Jan 13 23:02:38 UTC 2018

Hmm, I'm not sure about changing the Lift class, there are good
reasons to leave it the same and good reasons to change as well.
There is a lot of precedent for providing safe functions which use
unsafe functions (e.g. unsafeDupablePerformIO in bytestring / text).
Also, not much of the TH API uses TExp, just typed splices.  On the
other hand, it does make the method's type stronger and directly
suggest more properties.  It may encourage people to use typed splices
to define manual instances, which I think is good.

I propose a somewhat less breaking change, defining the following:

    class Lift t where
      typedLift :: t -> Q (TExp t)

    lift :: Lift t => t -> Q t
    lift = fmap unType . typedLift

The advantage of this is that a lot more code depends on usage of
'lift' than defining instances of 'Lift'.  A lot of the code that
defines instances of 'Lift' does it via the 'th-lift' package.  I
believe that only a handful of packages would need to be updated as a
result of this change, vs the dozens that would need to be updated by
changing the type of 'lift'.

Even after this change, I think that since 'TExp' is only useful with
typed splices, the 'lift' form would still find much more usage as the
more convenient function.


More information about the Libraries mailing list