我在使用 Lwt_main.run()
时遇到了一些错误。基本上我有两个类型的无限循环unit -> 'a Lwt.t = <fun>
,当我启动两个循环时,我会收到错误。我在上下文中使用它们,其中一个循环是编写器循环,另一个是读取器循环。基本上,我必须与编写器一起更新一些数据,而不是与阅读器一起使用。我收到的错误可以用下面的代码说明。
let rec p1 () =
Lwt_io.print "1n"
>>= fun () -> Lwt_unix.sleep 1.0
>>= p1
;;
val p1 : unit -> 'a Lwt.t = <fun>
let rec p5 () =
Lwt_io.print "5n"
>>= 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()
的正确用法是什么,以便我可以修复错误,而不仅仅是用通配符屏蔽它们?
首先,这不是错误,而是警告。它指出以 ;
结尾的表达式不会按预期计算为 unit
类型的值。在您的情况下,您有两个表达式p1 ()
计算结果为 unit Lwt.t
和p5 ()
计算结果为相同类型。显然他们没有类型 unit
,因此您不能将;
放在p1 ()
或p5 ()
之后。由于它们都是 lwt 线程,并且您想要(我怀疑)是并行运行它们,那么您需要使用 Lwt.pick
函数或其中缀等效<&>
:
let () = Lwt_main.run (p1 () <&> p5 ())
另一方面,如果你想序列化这个线程,即一个接一个地运行,而不是并行运行,那么你需要使用>>=
操作绑定它们,或者,如果你启用了语法支持,那么你可以使用>>
语法,这实际上代表一元分号。