Mat*_*hid 7 haskell template-haskell
我发现自己写了很多代码
putStr "foo (bar 1) (bar 2) =" print $ foo (bar 1) (bar 2)
麻烦的是,打印的消息可能与实际执行的代码不同步.显而易见的解决方案是自动生成此代码.
一种方法是将所有文本放在一个文件中,然后编写一个小程序来读取文件并从中生成Haskell源代码.但另一种选择是使用Template Haskell.
有没有人知道如何编写一个函数来获取String并从中生成上述代码?我猜它应该很容易,但TH没有很好的记录.
您可以使用该haskell-src-meta包解析Haskell代码.这是一个快速示例,您可以将其与Template Haskell结合使用.
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Language.Haskell.Meta
runShow = QuasiQuoter
{ quoteExp = runShowQQ
, quotePat = undefined
, quoteType = undefined
, quoteDec = undefined
}
runShowQQ :: String -> Q Exp
runShowQQ s = do
let s' = s ++ " = "
Right exp = parseExp s
printExp = appE [|print|] (return exp)
infixApp [|putStr s'|] [|(>>)|] printExp
Run Code Online (Sandbox Code Playgroud)
你会像这样使用它
{-# LANGUAGE QuasiQuotes #-}
[runShow|foo (bar 1) (bar 2)|]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |