我正在编写一些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。有什么建议吗?
答案 0 :(得分:3)
我认为没有办法做到这一点。这似乎是TemplateHaskell的限制。
在ModuleInfo
导入模块列表中只有完全限定名称才有意义,但我们不能在lookupValueName
中使用这些完全限定名称的事实是不好的。我认为我们需要lookupValueName
或lookupName
的变体,以Module
作为参数。
我建议在GHC问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket我们正在不断努力在下一个主要版本中改进TH。部分工作是改进包文档,导出函数等。这可能是其中一项改进。