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

标签 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。有什么建议吗?

最佳答案

我不认为有办法做到这一点。这似乎是 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/

相关文章:

haskell - 在父类(super class)函数的定义中使用子类实现

Haskell 的类型系统和逻辑编程——如何将 Prolog 程序移植到类型级别

haskell - 如何优化这个 Haskell 限价订单簿(带有代码、报告、图表)?

json - 如何用 aeson 解析嵌套的 JSON

haskell - 为什么我无法安装 template-haskell-2.17.0.0?

haskell - 有没有办法使用 Template Haskell 枚举模块中的所有函数?

haskell - 如何避免模板 Haskell 声明引用中的额外缩进?

haskell - 有没有办法在 Persistent Haskell 中没有任何过滤器或选择选项的情况下选择列表?

haskell - 使用模板 Haskell 时键入同义词 "not in scope"

haskell - 获取里面的函数名