HORIZON HASKELLDocslts/ghc-9.14.xb2f3bfd2026-10-11Search names, modules, packages, or :: a typeCtrl K

GHC 9.14.1 · lts/ghc-9.14.x · b2f3bfd · 2026-10-11

Moduletemplate-haskell-lift-0.1.0.0Haskell2010

Language.Haskell.TH.Lift

  • 3 types
  • 2 classes
  • 3 values
classclass 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 -> Code Q 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 ≡ unTypeCode (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

Representation-polymorphic since template-haskell-2.16.0.0.

This is exposed both from the template-haskell-lift and template-haskell packages. Consider importing it from the more stable template-haskell-lift if you don't need the full breadth of the template-haskell interface.

Methods

  • lift :: Quote m => t -> m Exp

    Turn a value into a Template Haskell expression, suitable for use in a splice.

  • liftTyped :: Quote m => t -> Code m t

    Turn a value into a Template Haskell typed expression, suitable for use in a typed splice.

Instances110Lift, …
  • Lift ByteArrayDefined in base-4.22.0.0 · Data.Array.Byte
  • Lift VoidDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift IntegerDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NaturalDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ForeignSrcLangDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Int16Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Int32Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Int64Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Int8Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ExtensionDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Addr#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift

    Produces an Addr# literal from the NUL-terminated C-string starting at the given memory address.

  • Lift Char#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Double#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Float#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Int#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Word#Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift AnnLookupDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift AnnTargetDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift BangDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift BndrVisDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift BodyDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift BytesDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift CallconvDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ClauseDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ConDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DecDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DecidedStrictnessDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DerivClauseDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DerivStrategyDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DocLocDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ExpDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift FamilyResultSigDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift FixityDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift FixityDirectionDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ForeignDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift FunDepDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift GuardDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift InfoDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift InjectivityAnnDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift InlineDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift LitDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift LocDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift MatchDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ModNameDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ModuleDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NameDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NameFlavourDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NameIsDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NameSpaceDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift NamespaceSpecifierDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift OccNameDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift OverlapDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PatDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PatSynArgsDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PatSynDirDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PhasesDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PkgNameDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift PragmaDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift RangeDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift RoleDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift RuleBndrDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift RuleMatchDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift SafetyDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift SourceStrictnessDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift SourceUnpackednessDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift SpecificityDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift StmtDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift TyLitDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift TySynEqnDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift TypeDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift TypeFamilyHeadDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift BoolDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift CharDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift DoubleDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift FloatDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift IntDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift WordDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Word16Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Word32Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Word64Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift Word8Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift ()Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift (# #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Integral a => Lift (Ratio a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift a => Lift (NonEmpty a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift a => Lift (Maybe a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift a => Lift (TyVarBndr a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift a => Lift [a]Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift (Fixed a)Defined in base-4.22.0.0 · Data.Fixed
  • Lift (TExp a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b) => Lift (Either a b)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b) => Lift (a, b)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c) => Lift (a, b, c)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d) => Lift (a, b, c, d)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e) => Lift (a, b, c, d, e)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift (a, b, c, d, e, f)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift (a, b, c, d, e, f, g)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • Lift a => Lift (# a #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b) => Lift (# a, b #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b) => Lift (# a | b #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c) => Lift (# a, b, c #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c) => Lift (# a | b | c #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d) => Lift (# a, b, c, d #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d) => Lift (# a | b | c | d #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e) => Lift (# a, b, c, d, e #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e) => Lift (# a | b | c | d | e #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift (# a, b, c, d, e, f #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift (# a | b | c | d | e | f #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift (# a, b, c, d, e, f, g #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
  • (Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift (# a | b | c | d | e | f | g #)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Lift
newtypenewtype Q a
#

In short, Q provides the Quasi operations in one neat monad for the user.

The longer story, is that Q wraps an arbitrary Quasi-able monad. The perceptive reader notices that Quasi has only two instances, Q itself and IO, neither of which have concrete implementations.Q plays the trick of dependency inversion, providing an abstract interface for the user which is later concretely fufilled by an concrete Quasi instance, internal to GHC.

Instances10Monad, Functor, MonadFix, MonadFail, Applicative, Quote, …
  • Monad QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Functor QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • MonadFix QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax

    If the function passed to mfix inspects its argument, the resulting action will throw a FixIOException.

  • MonadFail QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Applicative QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Quote QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • MonadIO QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Quasi QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Semigroup a => Semigroup (Q a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Monoid a => Monoid (Q a)Defined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
newtypenewtype Code (m :: Type -> Type) (a :: TYPE r)
#

Represents an expression which has type a, built in monadic context m. Built on top of TExp, typed expressions allow for type-safe splicing via:

  • typed quotes, written as [|| ... ||] where ... is an expression; if that expression has type a, then the quotation has type Quote m => Code m a

  • typed splices inside of typed quotes, written as $$(...) where ... is an arbitrary expression of type Quote m => Code m a

Traditional expression quotes and splices let us construct ill-typed expressions:

Example2 expressions
fmap ppr $ runQ (unTypeCode [| True == $( [| "foo" |] ) |])GHC.Internal.Types.True GHC.Internal.Classes.== "foo"GHC.Internal.Types.True GHC.Internal.Classes.== "foo"<interactive> error:    • Couldn't match expected type ‘Bool’ with actual type ‘[Char]’    • In the second argument of ‘(==)’, namely ‘"foo"’      In the expression: True == "foo"      In an equation for ‘it’: it = True == "foo"

With typed expressions, the type error occurs when constructing the Template Haskell expression:

Example1 expression
fmap ppr $ runQ (unTypeCode [|| True == $$( [|| "foo" ||] ) ||])<interactive> error:    • Couldn't match type ‘[Char]’ with ‘Bool’      Expected type: Code Q Bool        Actual type: Code Q [Char]    • In the Template Haskell quotation [|| "foo" ||]      In the expression: [|| "foo" ||]      In the Template Haskell splice $$([|| "foo" ||])
classclass Monad m => Quote (m :: Type -> Type) where
#

The Quote class implements the minimal interface which is necessary for desugaring quotations.

  • The Monad m superclass is needed to stitch together the different AST fragments.

  • newName is used when desugaring binding structures such as lambdas to generate fresh names.

Therefore the type of an untyped quotation in GHC is `Quote m => m Exp`

For many years the type of a quotation was fixed to be `Q Exp` but by more precisely specifying the minimal interface it enables the Exp to be extracted purely from the quotation without interacting with Q.

Instances2Quote
  • Quote QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Quote IODefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
datadata Exp
#

A Haskell expression.

Instances7Eq, Data, Ord, Show, Generic, Lift, …

Compatibilty shims

3 declarations
valueliftIntCompat :: Quote m => Integer -> m Exp
#

A compatibility shim for lifting an Int value without triggering bugs if RebindableSyntax is used in a module.