1

我在使用时遇到了一些错误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()以便我可以修复错误,而不仅仅是用通配符掩盖它们?

4

1 回答 1

4

首先,这不是错误,而是警告。它指出以 终止的表达式;不会unit按预期计算为类型的值。在您的情况下,您有两个p1 ()计算结果为相同类型的表达式。显然它们没有类型,所以你不能放在or之后。由于它们都是 lwt 线程,并且您想要(我怀疑)是并行运行它们,因此您需要使用函数或其中缀等效项:unit Lwt.tp5 ()unit;p1 ()p5 ()Lwt.pick<&>

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

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

于 2014-12-16T03:21:34.943 回答