在TemplateHaskell中,如何确定导入的模块已重命名?

时间:2015-11-10 21:43:42

标签: haskell template-haskell

我正在编写一些TemplateHaskell,用于将QuickCheck样式规范串联起来。我要求每个包含属性的模块都导出一个名为''axiom_set''的符号。然后,我的checkAxioms函数从我调用checkAxioms的模块中找到所有''axiom_set''符号。

checkAxioms :: DecsQ
checkAxioms = do
    ModuleInfo ms <- reifyModule =<< thisModule
    forM_ ms $ \mi@(Module _ m) -> do
        runIO . print =<< lookupValueName (modString m ++ ".axiom_set")

上面的代码应该找到所有导入的“axiom_set”符号。但是,如果Module.Axioms定义了axiom_set,但我导入的内容如下

import Module.Axioms as MA

我的代码找不到MA.axiom_set。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我认为没有办法做到这一点。这似乎是TemplateHaskell的限制。

ModuleInfo导入模块列表中只有完全限定名称才有意义,但我们不能在lookupValueName中使用这些完全限定名称的事实是不好的。我认为我们需要lookupValueNamelookupName的变体,以Module作为参数。

我建议在GHC问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket我们正在不断努力在下一个主要版本中改进TH。部分工作是改进包文档,导出函数等。这可能是其中一项改进。