Ocaml Lwt 类型混淆



我很困惑为什么 Lwt 打印函数Lwt_io.print有类型 string -> unit Lwt.t 但是如果我运行Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;结果是打印"ab"并返回类型单位。

我想这将是一个类型错误,因为Lwt_io.print返回单位Lwt.t而不是单位。为什么调用线程的第二部分?

我怀疑你因为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(>>=) 的第二个参数是 ff需要unit,这就是我们需要的,因为'aunit.它返回一个unit Lwt.t,所以'b也是unit。这意味着最终结果将是 unit Lwt.t .

在 Utop[1] 上,顶级lwtasync表达式分别使用 Lwt_main.runThread_safe.block_on_async_exn 自动运行。

要禁用它,请运行

UTop.set_auto_run_lwt false;; (* for lwt *)
UTop.set_auto_run_async false;; (* for async *)

[1] https://github.com/ocaml-community/utop/blob/c898602882e032ec3c5c8315d260cfbdb2f9eeb4/src/lib/uTop.mli#L114-L133

相关内容

  • 没有找到相关文章

最新更新