HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Moduleth-utilities-0.2.5.2Haskell2010

TH.Utilities

Miscellaneous Template Haskell utilities, added as needed by packages in the th-utilities repo and elsewhere.

  • 1 type
  • 19 values
valueunAppsT :: Type -> [Type]
#

Breaks a type application like A b c into [A, b, c]. In other words, it descends leftwards down AppT constructors, and yields a list of the results.

valuetupT :: [Q Type] -> Q Type
#

Given a list of types, produce the type of a tuple of those types. This is analogous to tupE and tupP.

tupT [[t|Int|], [t|Char|], [t|Bool]] = [t| (Int, Char, Bool) |]

@since FIXME

valuepromotedTupT :: [Q Type] -> Q Type
#

Given a list of types, produce the type of a promoted tuple of those types. This is analogous to tupE and tupP.

promotedTupT [[t|3|], [t| 'True|], [t|Bool]] = [t| '(3, 'True, Bool) |]

@since FIXME

valuetypeToNamedCon :: Type -> Maybe (Name, [Type])
#

Given a Type, returns a Just value if it's a named type constructor applied to arguments. This value contains the name of the type and a list of arguments.

valueexpectTyCon1 :: Name -> Type -> Q Type
#

Expect the provided type to be an application of a regular type to one argument, otherwise fail with a message. This will also work if the name is a promoted data constructor (PromotedT).

valueexpectTyCon2 :: Name -> Type -> Q (Type, Type)
#

Expect the provided type to be an application of a regular type to two arguments, otherwise fail with a message. This will also work if the name is a promoted data constructor (PromotedT).

valueproxyE :: TypeQ -> ExpQ
#

Given a type, construct the expression (Proxy :: Proxy ty).

valueeverywhereButStrings :: Data a => (forall b. Data b => b -> b) -> a -> a
#

Like the everywhere generic traversal strategy, but skips over strings. This can aid performance of TH traversals quite a bit.

valuedequalify :: Name -> Name
#

Construct a plain name (mkName) based on the given name. This is useful for cases where TH doesn't expect a unique name.

valuetypeRepToType :: TypeRep -> Q Type
#

Utility to convert Data.Typeable TypeRep to a Type. Note that this function is known to not yet work for many cases, but it does work for normal user datatypes. In future versions this function might have better behavior.

datadata ExpLifter
#

Hack to enable putting expressions inside lift-ed TH data. For example, you could do

    main = print $(lift [ExpLifter [e| 1 + 1 |],  ExpLifter [e| 2 |]])

Here, lift is working on a value of type [ExpLifter]. The code generated by lift constructs a list with the ExpLifter expressions providing the element values.

Without ExpLifter, lift tends to just generate code involving data construction. With ExpLifter, you can put more complicated expression into this construction.

Note that this cannot be used in typed quotes, because liftTyped will throw an exception. This is because this hack is incompatible with the type of liftTyped, as it would require the generated code to have type ExpLifter.

Constructors

Instances1Lift
valuedumpSplices :: DecsQ -> DecsQ
#

Print splices generated by a TH splice (the printing will happen during compilation, as a GHC warning). Useful for debugging.

For instance, you can dump splices generated with makeLenses by replacing a top-level invocation of makeLenses in your code with:

dumpSplices $ makeLenses ''Foo