【问题标题】:Why does windows need withSocketsDo?为什么windows需要withSocketsDo?
【发布时间】:2014-03-15 22:40:43
【问题描述】:

windows中需要初始化sockets,如Networks所示。

在 Windows 操作系统上,必须先使用 withSocketsDo 初始化网络子系统,然后才能使用任何网络操作。例如。

  main = withSocketsDo $ do {...}

虽然这仅在 Windows 平台上是绝对必要的,但在其他平台上是无害的,因此为了便携性,最好始终使用它。

窗户有什么特别之处?

【问题讨论】:

    标签: sockets haskell


    【解决方案1】:

    在现有版本的网络库中,withSocketsDo用于初始化Winsock library,这只是Windows的要求。在其他平台上,不需要初始化库,所以 withSocketsDo 什么都不做。

    在未来版本的网络库中,withSocketsDo 会被自动调用,因此只需要包含以与旧版本兼容,更改背后的详细信息请参阅this blog post。

    【讨论】:

      【解决方案2】:

      与其他平台不同,Windows 需要进程通过手动初始化 WinSock.dll 来启动其网络连接。同时,与其他语言不同,Haskell 在设计上没有全局可变状态。因此,WinSock 初始化不能隐藏在库的加载或某些单例对象的创建中,而是需要通过显式调用手动注册。

      【讨论】:

      • network 库可以强制使用诸如withSocketsDo 之类的东西,并使用几种众所周知的技术,例如将其所有操作包装在Network a 中而不是IO a。 withSocketsDo 至少可以追溯到 2006 年;一个更现代的图书馆会以不同的方式设计。
      • 强迫人们进入另一个 monad 只是为了使用网络操作对我来说听起来很可怕!我们可以使用隐式参数或强制所有函数都接受初始化的“证明”,但这同样看起来非常严厉。我个人认为目前的设计具有非常轻巧且不引人注目的优势。
      • 我不同意你的观点。这里的“问题”是withSocketsDo 的必要性仅在人类可读的文档中捕获。 network 不是的高级库应该隐藏初始化或将其作为不变量强制执行。
      • 当前的设计很糟糕,所以我在几个月前修复了它(最近合并)。没有什么需要修复的,它真的只是一个丑陋且不必要的疣。
      • @Christian 这也是一个困扰我的设计问题,也是(对于我计划开发的另一个库)。我有read about such techniques:需要一个令牌或另外包装在一个单子中。他们提供的保证很有吸引力,但是像Network a 这样位于IO a 之上的单子在语义上看起来很枯燥,因为它完全重复了IO 的语义。从概念上看,传递令牌看起来有点危险,因为它可以理解为传递“世界”并允许对世界状态进行非线性使用,而这些操作会修改
      猜你喜欢
      • 2015-11-07
      • 2019-04-13
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多