代码之家  ›  专栏  ›  技术社区  ›  John Millikin

GHC拒绝出口合格模块

  •  18
  • John Millikin  · 技术社区  · 14 年前

    我想写一个模块,它重新导出它导入的某个合格模块。像这样:

    module Foo.A
      ( module Foo.B
      , module Foo.C
      ) where
    import qualified Foo.B
    import qualified Foo.C
    
    -- bunch of code using Foo.B and Foo.C here
    

    这看起来应该是可行的;但是,GHC打印了关于出口的警告:

    Foo/A.hs:2:5:
        Warning: the export item `module Foo.B' exports nothing
    
    Foo/A.hs:3:5:
        Warning: the export item `module Foo.C' exports nothing
    

    而且GHCI拒绝从他们那里装载出口产品。

    我可以通过使导入不合格来解决这个问题,但是这些导入和主模块代码之间很可能会发生命名冲突。

    有没有办法让GHC出口这些模块?

    2 回复  |  直到 13 年前
        1
  •  13
  •   Yitz    14 年前

    不,这不仅是对温室气体的限制,而且是进口的方式 出口是为在哈斯克尔工作而设计的。

    一个模块只有 控制自己的命名空间-它不能影响人们 可以从其他名称空间看到。模块 “再出口”只是“全部出口”的简写。 我自己的命名空间中的符号 从另一个模块导入。但符号 你进口的合格品不是你自己的 命名空间。

    如果要导出具有 同样的名称,您将无法从一个模块完成。 将模块分为两部分,并从中导出每个版本 一个不同的模块。

        2
  •  6
  •   Jesse Rudolph    13 年前

    当导入模块打算基于限定导入的声明在导入模块中重新声明某些名称时,这种限制也是一种便利。例如:

    module MyPrelude (succ, module Prelude) where
    
    import qualified Prelude as P (succ)
    import Prelude hiding (succ)
    
    succ :: ...
    succ = ... P.succ ...
    

    如果没有太多冗长的词句,这个成语就很难表达了。另外,问你自己“没有层次模块这有意义吗?”如果不是,那么这是非常特定于GHC的,并且从表达式引用分层模块名称时实际发生的事情根本就不是分层的。

    至于为什么你能够重新导出由你没有导入的模块名限定的单个符号,这看起来像是一个让继承模块在GHC中继承工作的拼凑。在导入foo.a时获得foo.b限定符号是很神奇的,我认为这是因为foo这个名字与其说是foo.a,不如说是一个真正的继承祖先,但在使用foo.a的情况下,导出具有替代资格的东西的预期用途是。我认为如果没有GHC扩展,这种行为根本就没有意义,所以我将大胆猜测它是特定于GHC的。