6
如果我在TemplateHaskell中有一个Name
,并且想要查找它命名的变量的值,只要该变量被声明为文字,可以这样做吗?如何获取TemplateHaskell命名变量的字面值
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
如果我在TemplateHaskell中有一个Name
,并且想要查找它命名的变量的值,只要该变量被声明为文字,可以这样做吗?如何获取TemplateHaskell命名变量的字面值
var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
理论上,是的。在实践中,没有。
使用reify :: Name -> Q Info
查找有关现有名称的内容,对于此类定义,您将返回VarI
值,其中包含Maybe Dec
字段。这似乎表明,在某些情况下,您可能能够获取用于声明变量的语法树,这将允许您提取文字,但是current versions of GHC always returns Nothing
in this field,因此对于纯粹的TH解决方案而言,您运气不佳。
但是,TH确实允许运行任意的IO操作,所以你可以通过使用类似haskell-src-exts的方式加载和解析模块来解决这个问题,但是我怀疑这会比它的价值更麻烦。