Ошибка типа LWT 2.7.0
Я написал этот кусок кода с 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
)
PS: Спасибо Даниилу Батурину: http://baturin.org/code/lwt-counter-server/
1 ответ
Компилятор не заставил тип результата unit
, это заставило тип аргумента unit
потому что образец аргумента у вас есть ()
,
let%lwt
является Lwt.bind
так что продолжение (после in
) должен оценить обещание (_ Lwt.t
). поскольку sock
является Lwt_unix.file_descr
а не обещание, вы должны обернуть его Lwt.return sock
,
Может понадобиться больше контекста, чтобы ответить на ваш вопрос о предупреждении, я оставляю вам комментарий.