在 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
中使用那些完全限定名称这一事实很糟糕。我认为我们需要 lookupValueName
或 lookupName
的变体,它以 Module
作为参数。
我建议在 GHC 问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket 我们正在进行工作以在下一个主要版本中改进 TH。部分工作是关于改进包文档、导出函数等。这可以是改进之一。
我正在编写一些用于将 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
中使用那些完全限定名称这一事实很糟糕。我认为我们需要 lookupValueName
或 lookupName
的变体,它以 Module
作为参数。
我建议在 GHC 问题跟踪器上打开一个问题:https://ghc.haskell.org/trac/ghc/newticket 我们正在进行工作以在下一个主要版本中改进 TH。部分工作是关于改进包文档、导出函数等。这可以是改进之一。