Lwt 2.7.0 类型错误
Lwt 2.7.0 type error
这段代码是我用 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/
编译器没有将结果类型强制为unit
,而是将参数类型强制为unit
,因为你的参数模式是()
.
let%lwt
是 Lwt.bind
,因此延续(在 in
之后)必须评估为承诺(_ Lwt.t
)。由于 sock
是 Lwt_unix.file_descr
而不是承诺,因此您必须将其包装起来:Lwt.return sock
.
可能需要更多上下文才能回答您关于警告的问题,我正在给您留言。
这段代码是我用 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/
编译器没有将结果类型强制为unit
,而是将参数类型强制为unit
,因为你的参数模式是()
.
let%lwt
是 Lwt.bind
,因此延续(在 in
之后)必须评估为承诺(_ Lwt.t
)。由于 sock
是 Lwt_unix.file_descr
而不是承诺,因此您必须将其包装起来:Lwt.return sock
.
可能需要更多上下文才能回答您关于警告的问题,我正在给您留言。