如何从quasiquoter“运行”数据声明

时间:2015-05-25 23:24:39

标签: haskell template-haskell

我正在尝试为某些类型的声明编写一个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源代码(他们做路由的地方),但对我来说有点不透明。如何使用quasiquoter提供类型?

1 个答案:

答案 0 :(得分:3)

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

  

在拼接中,您只能调用导入模块中定义的函数,而不能调用同一模块中其他位置定义的函数。

所以把它们放在一起,这是使用sample

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

[sample||]

foo :: GenType
foo = GetType "foo"