2

我用 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):

Error: This expression has type Lwt_unix.file_descr
       but an expression was expected of type 'a Lwt.t

好吧,是的,sock是 type Lwt_unix.file_descr,为什么编译器会抛出这个程序并强制 type 'a Lwt.t?(当我问找到什么类型时,create_socket它告诉我它的类型unit -> '_a

PS:感谢 Daniil Baturin:http ://baturin.org/code/lwt-counter-server/

4

1 回答 1

2

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

let%lwtLwt.bind,所以延续(在 之后in)必须评估为一个承诺(_ Lwt.t)。既然sockLwt_unix.file_descr而不是承诺,你必须把它包装起来:Lwt.return sock.

可能需要更多上下文来回答您有关警告的问题,我正在给您发表评论。

于 2017-01-12T16:21:47.600 回答