我不明白为什么Lwt函数Lwt_io.print有string -> unit Lwt.t类型,但是如果我运行Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;,结果是打印"ab“并返回类型单元。
我想这将是一个类型错误,因为Lwt_io.print返回的是单元Lwt.t而不是单元。为什么线程的第二部分被调用?
发布于 2019-04-20 00:34:44
我怀疑你被弄糊涂了,因为utop很聪明。
如果您查看utop文档,它将被写入
当使用lwt或异步库时,UTop将自动等待'a Lwt.t或'a Deferred.t值并返回'a‘。
这就是为什么
Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;显示为unit类型。要查看真正的类型,请尝试以下步骤
let res = Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;
#show res;;你会看到,当你得到你所期望的,一个unit Lwt.t
更新:
为了明确类型,我们有
let f = fun () -> Lwt_io.print "b"
val ( >>= ) : 'a Lwt.t -> ('a -> 'b Lwt.t) -> 'b Lwt.t
val print : string -> unit Lwt.t
val f : unit -> unit Lwt.t因此,Lwt_io.print "a"返回一个unit Lwt.t。这是(>>=)的第一个参数,因此'a是unit。(>>=)的第二个参数是f。f采用unit,这正是我们所需要的,就像'a是unit一样。它返回一个unit Lwt.t,所以'b也是unit。这意味着最终的结果将是一个unit Lwt.t。
发布于 2022-04-02 02:17:58
在Utop1上,toplevel lwt和async表达式分别用Lwt_main.run和Thread_safe.block_on_async_exn自动运行。
要禁用该功能,请运行
UTop.set_auto_run_lwt false;; (* for lwt *)
UTop.set_auto_run_async false;; (* for async *)https://stackoverflow.com/questions/55769102
复制相似问题