我不确定名称空间在以下情况下如何工作:
Data.Streaming.Network从Data.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’
发生了什么,谁是正确的?
答案 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
,只需输入"*"
即可。