了解 OCaml Lwt.return_unit

Understanding OCaml Lwt.return_unit

我正在努力理解 this line:

Icmpv4_socket.connect ()
    >>= fun stack ->

定义为here:

let connect () = Lwt.return_unit

Icmpv4_socket.connect () 解析为 Lwt.return_unit 所以我将此行理解为解析为已完成的 Lwt promite。其中填充的值是参数为stack的函数。如果我理解正确,为什么承诺中的这个函数有用?谁用 stack 参数调用它?上下文:都在 Lwt 运行

Lwt.return_unit 是类型 unit Lwt.t 的现成值,换句话说,一个什么都不做的承诺。 Icmpv4_socket.connectdisconnect 都被定义为评估这个什么都不做的值,这意味着它们明确地什么都不做。

Where the value that is filled is a function with paremeter stack

实际上,填充的值是stack本身。之所以代码这样写:

Icmpv4_socket.connect ()
>>= fun stack ->

...就是先强制connect函数运行,兑现承诺,运行函数的内容fun stack -> ...履行的承诺。这是通过使用 >>=(称为 'bind')运算符完成的。 Mirage 人员有一个关于 Lwt 的轻量级线程模型、'bind' 运算符和此类主题的优秀教程:https://mirage.io/wiki/tutorial-lwt

您可能会问,如果 connect 函数实际上什么都不做,为什么它必须 运行?那是因为这个实现细节没有暴露给调用代码。这样的代码只能看到 signature 看起来像:

val connect : unit -> t Lwt.t

所以我们所知道的是我们需要调用 connect (),获得一个 Lwt 线程,它给我们一些价值(stack),然后从那里继续。