一个 "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"
我正在尝试为某些类型声明编写准引号。
我已经按照
的思路写了一些东西{-# 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"