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

In TemplateHaskell, how do I figure out that an imported module has been renamed?

我正在编写一些用于将 QuickCheck 样式规范串在一起的 TemplateHaskell。我要求每个包含属性的模块都导出一个名为“'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。有什么建议吗?

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

ModuleInfo 的导入模块列表中只使用完全限定名称是有道理的,但我们不能在 lookupValueName 中使用那些完全限定名称这一事实很糟糕。我认为我们需要 lookupValueNamelookupName 的变体,它以 Module 作为参数。

我建议在 GHC 问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket 我们正在进行工作以在下一个主要版本中改进 TH。部分工作是关于改进包文档、导出函数等。这可以是改进之一。