首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GHC拒绝导出合格的模块

GHC拒绝导出合格的模块
EN

Stack Overflow用户
提问于 2010-07-09 04:20:33
回答 2查看 2.6K关注 0票数 18

我想写一个模块,它重新出口一些模块,它已经进口合格。如下所示:

代码语言:javascript
复制
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会打印有关导出的警告:

代码语言:javascript
复制
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导出这些模块?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-09 04:43:24

不,这不仅仅是GHC的限制,这是Haskell中导入和导出的设计方式。

一个模块只能控制它自己的命名空间--它不能影响人们可以从其他命名空间看到的东西。模块"re-export“只是”导出我自己的命名空间中碰巧从其他模块导入到这里的所有符号“的简写。但是您导入的限定符号并不在您自己的命名空间中。

如果你想导出两个同名的不同符号,你不能从一个模块中做到这一点。将模块一分为二,并从不同的模块导出每个版本。

票数 13
EN

Stack Overflow用户

发布于 2011-10-30 12:34:14

当导入模块要根据限定导入的声明重新声明导入模块中的一些名称时,这种限制也很方便。例如:

代码语言:javascript
复制
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的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3207647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档