Правильное использование 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 ())
С другой стороны, если вы хотите сериализовать эти потоки, т. Е. Запускать один за другим, а не параллельно, то вам необходимо связать их, используя >>=
операции, или, если вы включили поддержку синтаксиса, то вы можете использовать >>
синтаксис, это на самом деле означает монадическая точка с запятой.