6

如果我有一个Namein TemplateHaskell 并想找出它命名的变量的值,前提是该变量被声明为文字,可以这样做吗?

var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
4

1 回答 1

4

理论上,是的。在实践中,没有。

使用 查找有关现有名称的内容reify :: Name -> Q Info,对于这样的定义,您将返回一个VarI包含Maybe Dec字段的值。这似乎表明您在某些情况下可能能够获得变量声明的语法树,这将允许您提取文字,但是当前版本的 GHC 总是Nothing在此字段中返回,所以您出局了纯 TH 解决方案的运气。

但是,TH 确实允许运行任意 IO 操作,因此您可以通过使用类似haskell-src-exts自己加载和解析模块来解决此问题,但我怀疑这会比它的价值更麻烦。

于 2012-02-19T01:53:53.433 回答