Lwt.return_unit
- это готовое значение типа unit Lwt.t
, другими словами, обещание, которое абсолютно ничего не делает. И Icmpv4_socket.connect
, и disconnect
определены для оценки этого значения бездействия, что означает, что они явно ничего не делают.
Где заполненное значение является функцией с параметром stack
На самом деле, заполненное значение - это stack
. Причина, по которой код написан так:
Icmpv4_socket.connect ()
>>= fun stack ->
... состоит в том, чтобы заставлять функцию connect
запустить сначала, выполнить свое обещание, , а затем запустить содержимое функции fun stack -> ...
, чтобы выполнить ее обещание. Это делается с помощью оператора >>=
(называемого 'bind'). Есть замечательный урок от Mirage о легкой модели потоков Lwt, операторе 'bind' и таких темах: https://mirage.io/wiki/tutorial-lwt
Вы можете спросить, почему connect
Функция должна работать, если она вообще ничего не делает? Это потому, что эта деталь реализации не подвержена вызову кода. Такой код видит только подпись , которая выглядит следующим образом:
val connect : unit -> t Lwt.t
Итак, все, что мы знаем, это то, что нам нужно вызвать connect ()
, получить поток Lwt
, который дает нам некоторое значение (stack
) и продолжайте оттуда.