我用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:http://baturin.org/code/lwt-counter-server/
发布于 2017-01-12 16:21:47
编译器没有将结果的类型强制为unit,而是将参数类型强制为unit,因为您拥有的参数模式是()。
let%lwt是Lwt.bind,所以延拓(在in之后)必须计算为一个承诺(_ Lwt.t)。因为sock是Lwt_unix.file_descr而不是承诺,所以您必须包装它:Lwt.return sock。
可能需要更多的上下文来回答您关于警告的问题,我给您留下一个评论。
https://stackoverflow.com/questions/41617724
复制相似问题