我正在尝试为某些类型的声明编写一个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提供类型?
答案 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"