【发布时间】:2014-03-15 22:40:43
【问题描述】:
windows中需要初始化sockets,如Networks所示。
在 Windows 操作系统上,必须先使用 withSocketsDo 初始化网络子系统,然后才能使用任何网络操作。例如。
main = withSocketsDo $ do {...}虽然这仅在 Windows 平台上是绝对必要的,但在其他平台上是无害的,因此为了便携性,最好始终使用它。
窗户有什么特别之处?
【问题讨论】:
windows中需要初始化sockets,如Networks所示。
在 Windows 操作系统上,必须先使用 withSocketsDo 初始化网络子系统,然后才能使用任何网络操作。例如。
main = withSocketsDo $ do {...}虽然这仅在 Windows 平台上是绝对必要的,但在其他平台上是无害的,因此为了便携性,最好始终使用它。
窗户有什么特别之处?
【问题讨论】:
在现有版本的网络库中,withSocketsDo用于初始化Winsock library,这只是Windows的要求。在其他平台上,不需要初始化库,所以 withSocketsDo 什么都不做。
在未来版本的网络库中,withSocketsDo 会被自动调用,因此只需要包含以与旧版本兼容,更改背后的详细信息请参阅this blog post。
【讨论】:
与其他平台不同,Windows 需要进程通过手动初始化 WinSock.dll 来启动其网络连接。同时,与其他语言不同,Haskell 在设计上没有全局可变状态。因此,WinSock 初始化不能隐藏在库的加载或某些单例对象的创建中,而是需要通过显式调用手动注册。
【讨论】:
network 库可以强制使用诸如withSocketsDo 之类的东西,并使用几种众所周知的技术,例如将其所有操作包装在Network a 中而不是IO a。 withSocketsDo 至少可以追溯到 2006 年;一个更现代的图书馆会以不同的方式设计。
withSocketsDo 的必要性仅在人类可读的文档中捕获。 network 不是的高级库应该隐藏初始化或将其作为不变量强制执行。
Network a 这样位于IO a 之上的单子在语义上看起来很枯燥,因为它完全重复了IO 的语义。从概念上看,传递令牌看起来有点危险,因为它可以理解为传递“世界”并允许对世界状态进行非线性使用,而这些操作会修改