dfl*_*str 6 macros interpolation haskell metaprogramming template-haskell
如果我Name在TemplateHaskell中有一个并且想要找出它命名的变量的值,只要该变量被声明为文字,这可以完成吗?
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
Run Code Online (Sandbox Code Playgroud)
理论上是的。实际上,没有。
查找有关现有名称的信息是使用 完成的reify :: Name -> Q Info,对于这样的定义,您将返回一个VarI值,其中包含一个Maybe Dec字段。这似乎表明您在某些情况下可能能够获取变量声明的语法树,这将允许您提取文字,但是当前版本的 GHC 总是Nothing在此字段中返回,所以您已经出局了纯 TH 解决方案的运气。
但是,TH 确实允许运行任意 IO 操作,因此您可以通过使用haskell-src-exts之类的工具自行加载和解析模块来解决此问题,但我怀疑这会带来更多麻烦。