Понимание OCaml Lwt.return_unit - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь понять эту строку :

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

Это определено здесь :

let connect () = Lwt.return_unit

Icmpv4_socket.connect () разрешается в Lwt.return_unit, поэтому я понимаю эту строку как преобразование в выполненный промет Lwt. Где заполненное значение является функцией с параметром stack. Если я правильно понял, почему эта функция внутри обещания полезна? Кто вызывает это с параметром stack? Контекст: все это внутри Lwt run

1 Ответ

1 голос
/ 25 апреля 2020

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) и продолжайте оттуда.

...