Ocaml Lwt 2.7.0类型错误

Ocaml Lwt 2.7.0类型错误,ocaml,lwt,Ocaml,Lwt,我用Lwt 2.7.0编写了这段代码: open Lwt let listen_address = Unix.inet_addr_loopback let port = 9000 let backlog = 1 let () = Lwt_log.add_rule "*" Lwt_log.Info let create_socket () = let open Lwt_unix in let sock = socket PF_INET SOCK_STREAM 0 in let s

我用Lwt 2.7.0编写了这段代码:

open Lwt

let listen_address = Unix.inet_addr_loopback
let port = 9000
let backlog = 1

let () = Lwt_log.add_rule "*" Lwt_log.Info

let create_socket () =
  let open Lwt_unix in
  let sock = socket PF_INET SOCK_STREAM 0 in
  let sockaddr = ADDR_INET(listen_address, port) in
  let%lwt () = Lwt_unix.Versioned.bind_2 sock sockaddr in
  listen sock backlog;
  sock
我得到了这个错误(在最后一行,即
sock
):

嗯,是的,
sock
属于
Lwt\u unix.file\u descr
类型,为什么编译器会抛出这个程序并强制类型为
'a Lwt.t
?(当我问为
create\u socket
找到了什么类型时,它告诉我它属于
unit->'\u a


注意:多亏了丹尼尔·巴图林:

编译器没有将结果类型强制为
unit
,而是将参数类型强制为
unit
,因为您的参数模式是
()

让%lwt
lwt.bind
,因此延续(在
中的
之后)必须计算为承诺(
\ulwt.t
)。由于
sock
Lwt\u unix.file\u descr
而不是承诺,因此必须将其包装为:
Lwt.return sock


可能需要更多的上下文来回答您关于警告的问题,我给您留下一条评论。

对于第一个错误,编译器很可能与函数调用相关。调用需要的不是文件描述符。您为
create_socket
unit->'a
)报告的类型与您报告的错误消息不一致,因此很难对此作出评论。然而,没有任何东西被强迫进入该单位。
create\u socket
的类型是
unit->Lwt\u unix.file\u descr
单元
是输入类型(在您的定义中由
()
表示)。在第二个示例中,我无法再现您的警告。我按字面意思粘贴了代码。还应该注意的是,由于类型错误,
create\u socket
的编译器没有推断出任何类型。
“\u a
是类型推断中间阶段的统一变量。哇,我写错了!我不明白答案,然后我又读了一遍我的问题,意识到我写了什么。问题用正确的类型更新。我删除了第二部分,我在>>中出现了一些错误(我在右侧的一个单元中使用了它),但是如果我不希望它被包装怎么办?如果你真的想避免显式包装它,你可以使用
Lwt\u unix.Versioned.bind\u 2 sock sockaddr>|=fun()->侦听sock backlog;sock
,但是
|=
有效地在内部为您包装它(实际上,它的效率稍微高一点)。不,我的意思是,如果我想返回Lwt_unix.file_descr类型的sock,而不是Lwt_unix.file_descr Lwt.t类型的sock怎么办?你不能,至少不容易,这是Lwt的类型安全特性。如果将%lwt foo=e放入e'
,则由
e
启动的计算将在将来完成
e
有一个承诺类型,让类型系统知道这一点。但是如果
e
在将来完成,那么
foo
只在将来可用,因此由
e'
启动的使用
foo
的计算也必须在将来完成。这意味着整个
let%lwt
必须按照承诺进行计算,因此使用它的函数将在
\ulwt.t
中具有结果类型。它告诉打电话的人,它没有马上完成。非常感谢,事实上,这是我不理解的承诺。我是这样使用的
let()=Lwt\u main.run(let%Lwt sock=create\u socket()in process\u client sock)
,我想这是正确的做法。;-)
Error: This expression has type Lwt_unix.file_descr
       but an expression was expected of type 'a Lwt.t