【问题标题】:How does one "run" a data declaration from a quasiquoter如何从准报价者“运行”数据声明
【发布时间】:2015-08-07 11:02:32
【问题描述】:

我正在尝试为某些类型声明编写一个准引用器。

我写了一些类似

的东西
{-# 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 源代码(他们在哪里路由),但这对我来说有点不透明。如何让准引用器提供一种类型?

【问题讨论】:

    标签: haskell template-haskell


    【解决方案1】:

    将您的模块导入另一个已打开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"
    

    【讨论】:

    • 好吧,我只是作为顶级声明离开。这实际上是有道理的 - 我试图从 GHCi 加载它!
    • 您可以通过加载SO_30447244_Def 然后运行runQ $ quoteDec sample "" 从GHCi 运行它来查看(TH 的内部表示)生成的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2021-04-03
    • 2014-08-25
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多