重新导出时的Haskell命名空间

时间:2015-08-21 15:42:02

标签: haskell module export

我不确定名称空间在以下情况下如何工作:

Data.Streaming.NetworkData.Streaming.Network.Internal

重新导出HostPreference

当我加载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’

发生了什么,谁是正确的?

1 个答案:

答案 0 :(得分: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,只需输入"*"即可。