首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml:需要类型为unit Lwt.t的Lwt表达式

OCaml:需要类型为unit Lwt.t的Lwt表达式
EN

Stack Overflow用户
提问于 2016-09-15 00:40:54
回答 1查看 357关注 0票数 1

我想为我的OUnit测试编写一个小服务器,当客户端通过套接字连接时,向客户端发送数据并退出。

因为我想在测试中使用它,所以我认为应该在线程中创建一个服务器,在线程中创建一个客户端。下面是代码:

代码语言:javascript
复制
open Sys
open Unix
open Lwt

(* a simple server that send a message when a client  connects
 * compile with
 * ocamlfind ocamlc -o lwt_server -package lwt,lwt.unix,unix  -linkpkg -g lwt_server.ml
 * http://baturin.org/code/lwt-counter-server/
 * https://mirage.io/wiki/tutorial-lwt
 * http://aubedesheros.blogspot.fr/2011/05/ocaml-lwt-mini-tutorial.html
 *)

let host = Unix.inet_addr_loopback (* 127.0.0.1 *)
let port = 6600
let max_pending_request = 10

(* Initialize logging capabilities at INFO level *)

let () = Lwt_log.add_rule "*" Lwt_log.Info

let send_message oc =
  Lwt_io.write_line oc "test"

let accept_connection conn =
  let fd, _ = conn in
  let oc = Lwt_io.of_fd Lwt_io.Output fd in
  Lwt.on_failure (send_message oc ) (fun e -> Lwt_log.ign_error (Printexc.to_string e));
  Lwt_log.info "New connection" >>= return

let create_server sock =
  let serve () =
    Lwt_unix.accept sock >>= accept_connection
  in serve

let sock_recv sock maxlen =
  let str = Bytes.create maxlen in
  let recvlen  = recv sock str 0 maxlen [] in
  String.sub str 0 recvlen

let sock_read sock =
  let answer = sock_recv sock 512 in
    Lwt_io.write_line Lwt_io.stdout answer

let create_socket () =
  let sock = Lwt_unix.socket PF_INET SOCK_STREAM 0 in
  Lwt_unix.bind sock @@ ADDR_INET(host, port);
  Lwt_unix.listen sock max_pending_request;
  sock


let () =
  let sock = create_socket () in
    let threads = Lwt.join [create_server sock; sock_read sock] in
      Lwt_main.run threads

下面是我用来编译它的命令和错误消息

代码语言:javascript
复制
ocamlfind ocamlc -o lwt_server -package lwt,lwt.unix,unix  -linkpkg -g lwt_server.ml
File "lwt_server.ml", line 53, characters 28-46:
Error: This expression has type unit -> unit Lwt.t
       but an expression was expected of type unit Lwt.t

第53行是指(不是开玩笑,我已经检查了两次):

代码语言:javascript
复制
        let threads = Lwt.join [create_server sock; sock_read sock] in

这是我第一次使用Lwt,我不确定它是否是我应该在OUnit中使用的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 11:49:52

问题是create_server sock返回另一个unit -> unit Lwt.t类型的函数,而不是类型错误中指示的LWT线程(unit Lwt.t):

代码语言:javascript
复制
let create_server sock =
  let serve () =
    Lwt_unix.accept sock >>= accept_connection
  in serve (* serve is a function, not a thread *)

您可以重写this以返回线程而不是函数来修复this类型错误:

代码语言:javascript
复制
let create_server sock =
  Lwt_unix.accept sock >>= accept_connection

我还没有对代码进行整体测试,但这应该可以修复类型错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39495672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档