Ошибка типа 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,

Может понадобиться больше контекста, чтобы ответить на ваш вопрос о предупреждении, я оставляю вам комментарий.

Другие вопросы по тегам