正确使用 Lwt_main.run()



我在使用 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.tp5 ()计算结果为相同类型。显然他们没有类型 unit ,因此您不能将;放在p1 ()p5 ()之后。由于它们都是 lwt 线程,并且您想要(我怀疑)是并行运行它们,那么您需要使用 Lwt.pick 函数或其中缀等效<&>

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

另一方面,如果你想序列化这个线程,即一个接一个地运行,而不是并行运行,那么你需要使用>>=操作绑定它们,或者,如果你启用了语法支持,那么你可以使用>>语法,这实际上代表一元分号。

相关内容

  • 没有找到相关文章

最新更新