如果我正在与第三方准引用者合作,例如thirdParty :: QuasiQuoter
,并且我想用这个准引号来编写我自己的,我该怎么做?在ghci我试过
runQ [| [thirdParty| |] |]
但这输出(在我的情况下):
LamE [VarP _render_2] (AppE (VarE GHC.Base.return) (ConE GHC.Tuple.()))
哪个没有告诉我" [thirdParty |。]的抽象语法树是什么|]"似乎我无法使用模板Haskell构建这样的模式。
答案 0 :(得分:4)
答案很简单,我在问完这个问题的那一刻就想到了。关于QuasiQuoter
没有什么神奇之处。这是一个简单的老无聊的代数数据类型!只是做:
myQuasiQuoter = QuasiQuoter { quoteExp = f (quoteExp thirdParty) }
其中f
是根据需要转换准引号的函数。如果需要,对quotePat
,quoteType
和quoteDec
执行相同的操作。