2

私は 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 : Daniil Baturin に感謝します : http://baturin.org/code/lwt-counter-server/

4

1 に答える 1

2

コンパイラは、結果の型を に強制していません。引数のパターンが であるため、引数unitの型を強制しました。unit()

let%lwtであるLwt.bindため、継続 ( の後in) は promise ( _ Lwt.t) に評価される必要があります。sockはpromise ではないためLwt_unix.file_descr、ラップする必要があります: Lwt.return sock.

警告に関するあなたの質問に答えるには、より多くのコンテキストが必要になる場合があります。コメントを残しています。

于 2017-01-12T16:21:47.600 に答える