在绑定线程链中将ref设置为Lwt_io.read_line的结果

时间:2019-04-14 23:13:44

标签: ocaml monads ocaml-lwt

我正在创建聊天服务器,并且具有处理登录的功能。存在一个称为nick的预设ref和一个预设的输入流imp。我的代码如下:

let handle_login nr (inp,outp) = 
Lwt_io.printl "<Enter your 'nick'name>" >>= Lwt.return(nick := (Lwt_io.read_line inp))

但是,这段代码给了我错误:

Error: This expression has type string Lwt.t
       but an expression was expected of type string.

我知道以下代码确实有效:

let handle_login nr (inp,outp) = 
Lwt_io.printl "<Enter your 'nick'name>" >>= Lwt.return(nick := "Jane")

简而言之,我不知道如何将var分配给从线程获得的值。

1 个答案:

答案 0 :(得分:1)

我对Lwt不太熟悉,但是如果它像任何其他monad一样工作,我认为这应该可行:

let handle_login nr (inp, outp) = 
  Lwt_io.printl "<Enter your 'nick'name>"
  >>= fun () -> Lwt_io.read_line inp
  >>= fun str -> Lwt.return (nick := str)

但是我也必须指出,从异步代码中更改共享状态是一场灾难,等待着发生。您可以做到这一点当然并不意味着您应该