2013-06-21 34 views
28

我有一個Haskell模塊,我希望它導出在文件中聲明的所有對象,除了一個特定功能local_funcHaskell:隱藏模塊導出中的特定函數?

是否有一個更清晰的方法來實現這一點比編寫一個明確列出所有其他聲明的出口列表(並仔細保持此列表爲最新的所有永久性)?

換句話說,我想要一個類似import MyModule hiding (local_func),但在導出模塊中指定,而不是在導入時指定。

回答

26

據我所知,目前還沒有辦法做到這一點。

我通常最終做的是擁有一箇中央模塊,它將重要的東西重新導出爲一種便捷的方式來導入所需的所有東西,而不在定義這些東西的模塊中隱藏任何東西(在某些情況下 - 您可能無法預見! - 讓用戶更容易修改模塊中的內容)。

爲此使用的語法如下:

-- |Convenient import module 
module Foo.Import (module All) where 

-- Import what you want to export 
import Foo.Stuff as All hiding (local_func) 
-- You can import several modules into the same namespace for this trick! 
-- For example if using your module also requires 'decode' from "Data.Aeson" you can do 
import Data.Aeson as All (decode) 

現在已經方便出口這些東西。

+3

很好的建議:「在某些情況下 - 你大概不會預見 - 使得它更容易爲你的用戶修改的東西在你的模塊!」是的!根據我的經驗,這是一個常見問題,當cabal-packaged模塊被「鎖定」並且出口列表過於嚴格時,我知道沒有比編輯和重新安裝軟件包更好的解決方案了,這很煩人。 – ntc2

5

不幸的不是。

可以想象一個小的語法加法,它可以讓你要求的東西。現在有可能寫出:

module M (module M) where 

foo = quux 

quux = 1+2 

您可以明確地導出整個模塊。但是,假設我們添加了可以隱藏該模塊的語法。然後,我們將能夠這樣寫:

module M (module M hiding (quux)) where 

foo = quux 

quux = 1+2