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