    {-# LANGUAGE Haskell2010 #-}
    {-# LANGUAGE TemplateHaskell #-}

    module TemplateHaskellQuasiquotes where

    import Language.Haskell.TH

    aDecl :: DecsQ
    aDecl :: DecsQ
    aDecl = [d|
        bar :: $TypeQ
    aType -> [ (Int, String) ]
        bar $PatQ
    aPattern = $ExpQ
    anExpression
      |]

    aPattern :: PatQ
    aPattern :: PatQ
    aPattern = [p|
        [ aCrazyLongVariableName
        , _unused
        , (y, z)
        , ( $PatQ
    aNumberPattern, "hello")
        ]
      |]

    aNumberPattern :: PatQ
    aNumberPattern :: PatQ
    aNumberPattern = [p|
        w@v@4.5
      |]

    anExpression, anExpression2 :: ExpQ
    anExpression :: ExpQ
    anExpression = [e|
        [ (1 + $ExpQ
    anExpression2, "world") ]
      |]
    anExpression2 :: ExpQ
    anExpression2 = [| (1 + round pi) |]

    aType :: TypeQ
    aType :: TypeQ
    aType = [t|
        [ (Double, String) ]
      |]

    typedExpr1 :: Code Q ()
    typedExpr1 :: Code Q ()
    typedExpr1 = [|| () ||]

    typedExpr :: Code Q ()
    typedExpr :: Code Q ()
    typedExpr = [|| a -> b -> a
    forall a b. a -> b -> a
    const $$(Code Q ()
    typedExpr1) () ||]