一个 "run" 如何从准引用者中声明数据

How does one "run" a data declaration from a quasiquoter

我正在尝试为某些类型声明编写准引号。

我已经按照

的思路写了一些东西
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH as TH
import Language.Haskell.TH.Quote

sample :: QuasiQuoter
sample =
   let tName    = TH.mkName "GenType"
       conName  = TH.mkName "GetType"
       nameName = TH.mkName "name"
       creator _ = return [TH.DataD [] tName [] [TH.RecC conName [(nameName, TH.NotStrict,TH.ConT ''String)]] [''Show, ''Eq]]
   in QuasiQuoter { quoteDec = creator
                  , quotePat = undefined
                  , quoteType = undefined
                  , quoteExp = undefined }

现在我遇到了使该类型 "GenType" 可用的问题。我已经查看了 yesod 源代码(他们在哪里做路由),但它对我来说有点不透明。如何使准引用者可以使用一种类型?

将您的模块导入到另一个启用了 QuasiQuotes LANGUAGE pragma 的模块中,然后使用语法 [sample||] 调用它。请注意,它需要在一个单独的模块中;您不能在定义的同一模块中开始使用 [sample||] 。请参见例如section 7.17.1 in the GHC 7.10.1 manual:

Inside a splice you can only call functions defined in imported modules, not functions defined elsewhere in the same module.

所以把它们放在一起,这里有一个使用 sample:

的例子
{-# LANGUAGE QuasiQuotes #-}
import SO_30447244_Def -- this is the module containing the code 
                       -- from the original question

[sample||]

foo :: GenType
foo = GetType "foo"