使用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()
的正确用法是什么,以便我可以修复错误而不是用通配符掩盖它们?
答案 0 :(得分:4)
首先,这不是错误,而是警告。它声明以;
终止的表达式不会按预期计算为unit
类型的值。在您的情况下,您有两个表达式p1 ()
,它们的计算结果为unit Lwt.t
和p5 ()
,它们的计算结果相同。显然,他们没有unit
类型,因此您无法在;
或p1 ()
之后放置p5 ()
。由于它们都是lwt线程,而你想要的(我怀疑)是并行运行它们,那么你需要使用Lwt.pick
函数,或者它的中缀等价<&>
:
let () = Lwt_main.run (p1 () <&> p5 ())
另一方面,如果你想序列化这个线程,即一个接一个地运行,而不是并行运行,那么你需要使用>>=
操作绑定它们,或者,如果你已经启用了语法支持,那么你可以使用>>
语法,这实际上代表monadic分号。