2015-08-21 29 views
2

的時候我不知道該命名空間在以下情況下是如何工作的:哈斯克爾命名空間reexporting

Data.Streaming.Network轉口貿易寄主偏愛從Data.Streaming.Network.Internal

當我在ghci中加載了,我可以看到,構造函數是由前綴原始名稱空間。

$ ghci               
GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> import Data.Streaming.Network 
Prelude Data.Streaming.Network> :info HostPreference 
data HostPreference 
    = Data.Streaming.Network.Internal.HostAny 
    | Data.Streaming.Network.Internal.HostIPv4 
    | Data.Streaming.Network.Internal.HostIPv4Only 
    | Data.Streaming.Network.Internal.HostIPv6 
    | Data.Streaming.Network.Internal.HostIPv6Only 
    | Data.Streaming.Network.Internal.Host String 
     -- Defined in ‘Data.Streaming.Network.Internal’ 

但是有些程序希望綁定的構造函數在重新導出模塊Data.Streaming.Network下可用。

Prelude Data.Streaming.Network> :l src/Server.hs 
[1 of 1] Compiling Main    (src/Server.hs, interpreted) 

src/Server.hs:14:58: Not in scope: data constructor ‘HostAny’ 

這是怎麼回事,誰是正確的?

回答

2

HostPreference的構造函數未導出,streaming-commons包打算將它們設置爲私有的,如果我要根據導出的內容來判斷。相反,文檔建議使用OverloadedStrings和打字字符串文字,以獲得不同的值:

data HostPreference

哪個主機綁定。

注:IsString實例識別下列特殊值:

*意味着HostAny

*4意味着HostIPv4

!4意味着HostIPv4Only

*6意味着HostIPv6

!6表示HostIPv6Only

其他值被視爲主機名。作爲示例,僅綁定到IPv4本地主機,請使用"127.0.0.1"

因此,在你Server.hs,只是使OverloadedStrings,然後在任何你正在嘗試使用HostAny只需鍵入"*"代替。

+0

非常有用,這裏有很多實用主題。謝謝 – nicolas