Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Documentation
deriveLift' :: [Role] -> Info -> Q [Dec] Source #
Obtain Info
values through a custom reification function. This is useful
when generating instances for datatypes that have not yet been declared.
makeLift :: Name -> Q Exp Source #
Generates a lambda expresson which behaves like lift
(without requiring
a Lift
instance). Example:
newtype Fix f = In { out :: f (Fix f) } instance Lift (f (Fix f)) => Lift (Fix f) where lift = $(makeLift ''Fix)
This can be useful when deriveLift
is not clever enough to infer the
correct instance context, such as in the example above.
class Lift (t :: TYPE r) where #
A Lift
instance can have any of its values turned into a Template
Haskell expression. This is needed when a value used within a Template
Haskell quotation is bound outside the Oxford brackets ([| ... |]
or
[|| ... ||]
) but not at the top level. As an example:
add1 :: Int -> Q (TExp Int) add1 x = [|| x + 1 ||]
Template Haskell has no way of knowing what value x
will take on at
splice-time, so it requires the type of x
to be an instance of Lift
.
A Lift
instance must satisfy $(lift x) ≡ x
and $$(liftTyped x) ≡ x
for all x
, where $(...)
and $$(...)
are Template Haskell splices.
It is additionally expected that
.lift
x ≡ unTypeQ
(liftTyped
x)
Lift
instances can be derived automatically by use of the -XDeriveLift
GHC language extension:
{-# LANGUAGE DeriveLift #-} module Foo where import Language.Haskell.TH.Syntax data Bar a = Bar1 a (Bar a) | Bar2 String deriving Lift
Levity-polymorphic since template-haskell-2.16.0.0.
lift :: Quote m => t -> m Exp #
Turn a value into a Template Haskell expression, suitable for use in a splice.
liftTyped :: forall (m :: Type -> Type). Quote m => t -> Code m t #
Turn a value into a Template Haskell typed expression, suitable for use in a typed splice.
Since: template-haskell-2.16.0.0
Instances
Lift Addr# | Produces an Since: template-haskell-2.16.0.0 |
Lift Double# | Since: template-haskell-2.16.0.0 |
Lift Float# | Since: template-haskell-2.16.0.0 |
Lift Int# | Since: template-haskell-2.16.0.0 |
Lift Void | Since: template-haskell-2.15.0.0 |
Lift Int16 | |
Lift Int32 | |
Lift Int64 | |
Lift Int8 | |
Lift Word16 | |
Lift Word32 | |
Lift Word64 | |
Lift Word8 | |
Lift ModName Source # | |
Lift Name Source # | |
Lift NameFlavour Source # | |
Defined in Language.Haskell.TH.Lift lift :: Quote m => NameFlavour -> m Exp # liftTyped :: forall (m :: Type -> Type). Quote m => NameFlavour -> Code m NameFlavour # | |
Lift NameSpace Source # | |
Lift OccName Source # | |
Lift PkgName Source # | |
Lift Integer | |
Lift Natural | |
Lift () | |
Lift Bool | |
Lift Char | |
Lift Double | |
Lift Float | |
Lift Int | |
Lift Word | |
Lift Char# | Since: template-haskell-2.16.0.0 |
Lift Word# | Since: template-haskell-2.16.0.0 |
Integral a => Lift (Ratio a :: Type) | |
Lift a => Lift (NonEmpty a :: Type) | Since: template-haskell-2.15.0.0 |
Lift a => Lift (Maybe a :: Type) | |
Lift a => Lift ([a] :: Type) | |
(Lift a, Lift b) => Lift (Either a b :: Type) | |
(Lift a, Lift b) => Lift ((a, b) :: Type) | |
(Lift a, Lift b, Lift c) => Lift ((a, b, c) :: Type) | |
(Lift a, Lift b, Lift c, Lift d) => Lift ((a, b, c, d) :: Type) | |
(Lift a, Lift b, Lift c, Lift d, Lift e) => Lift ((a, b, c, d, e) :: Type) | |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift ((a, b, c, d, e, f) :: Type) | |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift ((a, b, c, d, e, f, g) :: Type) | |
Lift (# #) | Since: template-haskell-2.16.0.0 |
Lift a => Lift ((# a #) :: TYPE ('TupleRep '['BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b) => Lift ((# a | b #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b) => Lift ((# a, b #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c) => Lift ((# a | b | c #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c) => Lift ((# a, b, c #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d) => Lift ((# a | b | c | d #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d) => Lift ((# a, b, c, d #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e) => Lift ((# a | b | c | d | e #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e) => Lift ((# a, b, c, d, e #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift ((# a | b | c | d | e | f #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift ((# a, b, c, d, e, f #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift ((# a | b | c | d | e | f | g #) :: TYPE ('SumRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift ((# a, b, c, d, e, f, g #) :: TYPE ('TupleRep '['BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted, 'BoxedRep 'Lifted])) | Since: template-haskell-2.16.0.0 |