我想写一个模块,它重新导出一些已导入合格的模块。像这样:
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导出这些模块?
答案 0 :(得分:13)
不,这不仅仅是GHC的限制,而是导入的方式 和导出旨在在Haskell中工作。
一个模块只有 控制自己的命名空间 - 它不能影响人们 从其他命名空间可以看到。一个模块 “再出口”只是说“全部出口”的简写 碰巧我自己的命名空间中的符号 从那个其他模块进口到这里“。但符号 你导入合格的并不是你自己的 命名空间。
如果要导出两个不同的符号 相同的名称,您将无法从一个模块中执行此操作。 将模块拆分为两个,然后从中导出每个版本 一个不同的模块。
答案 1 :(得分:6)
当导入模块根据合格导入的声明重新声明导入模块中的某些名称时,此限制也很方便。例如:
module MyPrelude (succ, module Prelude) where
import qualified Prelude as P (succ)
import Prelude hiding (succ)
succ :: ...
succ = ... P.succ ...
如果没有很多冗长的话,这个成语真的很难表达。另外,问问你自己“没有分层模块会有意义吗?”。如果没有,那么这是非常具体的,并且当从表达式引用分层模块名称时实际上发生的事情根本不是分层的。
至于为什么你能够重新导出由你没有导入的某个模块名称限定的单个符号,这似乎是让hehrchical模块在ghc中以heirachically工作的kludge。在导入Foo时获得Foo.B限定符号.A是神奇的,我认为它是因为Foo这个名字不再是Foo.A的实际的heirachical祖先,但出于具有替代资格的东西的预期用途是在使用它的情况下来自Foo。如果没有GHC扩展,我认为这种行为根本没有意义,所以我会猜测它的GHC具体。