Правильное использование Lwt_main.run()

Я столкнулся с некоторыми ошибками при использовании Lwt_main.run(), В основном у меня есть два бесконечных цикла с типом unit -> 'a Lwt.t = <fun> и когда я запускаю оба цикла, я получаю ошибки. Я использую их в контексте того, что один цикл является циклом записи, а другой - циклом чтения. По сути, мне приходится обновлять некоторые данные с помощью устройства записи гораздо чаще, чем я использую их с устройством чтения. Ошибки, которые я получаю, могут быть проиллюстрированы с помощью кода ниже.

let rec p1 () =
Lwt_io.print "1\n"
>>= fun () -> Lwt_unix.sleep 1.0
>>= p1
;;

val p1 : unit -> 'a Lwt.t = <fun>

let rec p5 () =
Lwt_io.print "5\n"
>>= fun () -> Lwt_unix.sleep 5.0
>>= p5
;;

val p5 : unit -> 'a Lwt.t = <fun>

Lwt_main.run(p1(); p5());;

Characters 13-17:
Warning 10: this expression should have type unit.
Characters 13-17:
Warning 10: this expression should have type unit.

Я могу выполнить операторы Lwt_main.run следующим образом без ошибок, но кажется, что это решение просто маскирует предупреждение подстановочным знаком, а не исправляет предупреждение.

let _ = Lwt_main.run(p1())
let _ = Lwt_main.run(p5())

Как правильно использовать Lwt_main.run() в этом контексте, чтобы я мог исправить ошибки, а не просто маскировать их подстановочным знаком?

1 ответ

Решение

Прежде всего это не ошибка, а предупреждение. Это заявляет, что выражение, которое заканчивается ; не оценивает значение типа unit как и ожидалось. В вашем случае у вас есть два выражения p1 () что оценивает unit Lwt.t а также p5 () который оценивает к тому же типу. Очевидно, они не имеют типа unitтак что нельзя поставить ; после p1 () или же p5 (), Поскольку оба они являются потоками lwt, и вы хотите (я подозреваю) запустить их параллельно, тогда вам нужно использовать Lwt.pick функция или ее инфиксный эквивалент <&>:

let () = Lwt_main.run (p1 () <&> p5 ())

С другой стороны, если вы хотите сериализовать эти потоки, т. Е. Запускать один за другим, а не параллельно, то вам необходимо связать их, используя >>= операции, или, если вы включили поддержку синтаксиса, то вы можете использовать >> синтаксис, это на самом деле означает монадическая точка с запятой.

Другие вопросы по тегам