我想写一个模块,它重新出口一些模块,它已经进口合格。如下所示:
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导出这些模块?
发布于 2010-07-09 04:43:24
不,这不仅仅是GHC的限制,这是Haskell中导入和导出的设计方式。
一个模块只能控制它自己的命名空间--它不能影响人们可以从其他命名空间看到的东西。模块"re-export“只是”导出我自己的命名空间中碰巧从其他模块导入到这里的所有符号“的简写。但是您导入的限定符号并不在您自己的命名空间中。
如果你想导出两个同名的不同符号,你不能从一个模块中做到这一点。将模块一分为二,并从不同的模块导出每个版本。
发布于 2011-10-30 12:34:14
当导入模块要根据限定导入的声明重新声明导入模块中的一些名称时,这种限制也很方便。例如:
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使用它的情况下。我认为如果没有GHC扩展,这种行为是没有意义的,所以我会大胆猜测它是特定于GHC的。
https://stackoverflow.com/questions/3207647
复制相似问题