Lwt 2.7.0类型错误

时间:2017-01-12 16:00:55

标签: 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 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的类型为Lwt_unix.file_descr,为什么编译器会抛出这个程序并强制类型为'a Lwt.t? (当我问create_socket找到什么类型时,它告诉我它的类型为unit -> '_a

P.S。 :感谢Daniil Baturin:http://baturin.org/code/lwt-counter-server/

1 个答案:

答案 0 :(得分:2)

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

let%lwtLwt.bind,因此延续(in之后)必须评估为承诺(_ Lwt.t)。由于sockLwt_unix.file_descr而不是承诺,因此您必须将其换行:Lwt.return sock

可能需要更多背景信息来回答您关于警告的问题,我会留下您的评论。