2010-07-08 42 views
18

我想寫一個模塊,它重新導出一些它已經導入的模塊合格。這樣的事情:GHC拒絕出口合格的模塊

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導出這些模塊?

回答

12

不,這不只是一個GHC的限制,它的進口 和出口設計在Haskell的工作方式。

一個模塊只有 控制自己的命名空間 - 它不能影響人們從其他命名空間可以看到的東西。模塊 「再出口」只是一個速記說「導出符號的所有 在我自己的命名空間中恰好有 從其他模塊這裏進口」。但是您輸入的符號 並不是真的在您自己的 命名空間中。

如果要導出具有 相同名稱的兩個不同的符號,你將不能夠從一個模塊做。 將模塊拆分爲兩部分,並從 中導出不同的模塊。

+4

但可以重新導出符合條件的符號;例如,'import qualified Foo.B'會讓我做'module Foo.A(Foo.B.sym)'。爲什麼模塊不可能這樣做? 我不會導出兩個具有相同名稱的符號;任何衝突都是模塊的內部。 – 2010-07-08 22:47:25

6

這種限制也是一個方便的時候進口模塊是指進口模塊中重新申報一些名字,基於一個合格的進口報關單。例如:

module MyPrelude (succ, module Prelude) where 

import qualified Prelude as P (succ) 
import Prelude hiding (succ) 

succ :: ... 
succ = ... P.succ ... 

這個成語是真的很難沒有很多冗長的否則表達。另外,請問你的自己「這是否合理,沒有分層模塊?」。如果不是,那麼這是非常具體的,並且從表達式引用分層模塊名稱時實際發生的事情根本不是分層的。

至於你爲什麼能夠再出口你沒有導入的某個模塊名稱限定的單個符號,這看起來像是一個混亂的模塊來讓heirarchical模塊以ghc的形式工作。在導入Foo.A時獲得符合Foo.B標準的符號是神奇的,我認爲它是因爲Foo這個名稱不再是一個真正的繼承祖先,而是Foo.A,但是出口具有替代資格的東西的預期用途是在其使用的情況下來自Foo。如果沒有GHC擴展,我不認爲這種行爲是有意義的,所以我會大膽猜測它的GHC具體。