首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocaml Lwt类型混淆

Ocaml Lwt类型混淆
EN

Stack Overflow用户
提问于 2019-04-20 00:06:55
回答 2查看 203关注 0票数 1

我不明白为什么Lwt函数Lwt_io.printstring -> unit Lwt.t类型,但是如果我运行Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;,结果是打印"ab“并返回类型单元。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-20 00:34:44

我怀疑你被弄糊涂了,因为utop很聪明。

如果您查看utop文档,它将被写入

当使用lwt或异步库时,UTop将自动等待'a Lwt.t或'a Deferred.t值并返回'a‘。

这就是为什么

代码语言:javascript
复制
Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;

显示为unit类型。要查看真正的类型,请尝试以下步骤

代码语言:javascript
复制
let res = Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;
#show res;;

你会看到,当你得到你所期望的,一个unit Lwt.t

更新:

为了明确类型,我们有

代码语言:javascript
复制
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。这是(>>=)的第一个参数,因此'aunit(>>=)的第二个参数是ff采用unit,这正是我们所需要的,就像'aunit一样。它返回一个unit Lwt.t,所以'b也是unit。这意味着最终的结果将是一个unit Lwt.t

票数 3
EN

Stack Overflow用户

发布于 2022-04-02 02:17:58

在Utop1上,toplevel lwtasync表达式分别用Lwt_main.runThread_safe.block_on_async_exn自动运行。

要禁用该功能,请运行

代码语言:javascript
复制
UTop.set_auto_run_lwt false;; (* for lwt *)
UTop.set_auto_run_async false;; (* for async *)

1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55769102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档