2014-10-04 50 views
4

如果我正在与第三方准报价商合作,例如thirdParty :: QuasiQuoter,并且我想根据这个准报价器编写自己的报价单,那怎么办我这样做?在ghci中我试图如何用另一个准报价器编写准报价器

runQ [| [thirdParty| |] |] 

但这输出(在我的情况):

LamE [VarP _render_2] (AppE (VarE GHC.Base.return) (ConE GHC.Tuple.())) 

这并没有告诉我什么抽象语法树|看来是如此的“[第三方|]”我不能用模板Haskell构建这样的模式。

回答

4

答案很简单,我在问完问题的那一刻就想起了它。 QuasiQuoter没有什么神奇的。这是一个简单的旧无聊的代数数据类型!只要做到:

myQuasiQuoter = QuasiQuoter { quoteExp = f (quoteExp thirdParty) } 

哪里f是转换为所需的准加引号的功能。如果需要,为quotePatquoteTypequoteDec做同样的事情。