我正在编写一些 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。有什么建议吗?
最佳答案
我不认为有办法做到这一点。这似乎是 TemplateHaskell 的一个限制。
在 ModuleInfo
中只有完全限定的名称是有道理的s 导入模块列表,但事实上我们不能在 lookupValueName
中使用这些完全限定名称不好。我认为我们需要 lookupValueName
的变体或 lookupName
这需要 Module
作为论据。
我建议在 GHC 问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket我们正在努力在下一个主要版本中改进 TH。部分工作是关于改进包文档、导出函数等。这可能是改进之一。
关于haskell - 在 TemplateHaskell 中,我如何确定导入的模块已被重命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640171/