Ocaml 设置对绑定线程链中Lwt_io.read_行的结果的引用

Ocaml 设置对绑定线程链中Lwt_io.read_行的结果的引用,ocaml,monads,ocaml-lwt,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)) 我知道以下代码确实有效: let handle_login nr (inp,outp) = Lwt_io.p

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

let handle_login nr (inp,outp) = 
Lwt_io.printl "<Enter your 'nick'name>" >>= Lwt.return(nick := (Lwt_io.read_line inp))
我知道以下代码确实有效:

let handle_login nr (inp,outp) = 
Lwt_io.printl "<Enter your 'nick'name>" >>= Lwt.return(nick := "Jane")
let handle\u登录编号(输入、输出)=
Lwt_io.printl”“>>=Lwt.return(尼克:=“简”)

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

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

let handle\u登录编号(输入、输出)=
Lwt_io.printl“”
>>=fun()->Lwt\u io.read\u line inp
>>=fun str->Lwt.return(尼克:=str)

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

从Lwt代码(异步代码和JS承诺代码)中变异共享状态通常是安全的,因为所有回调都在主线程上运行,并且不能被抢占。只要您确定在整个回调粒度上所有可能的交错都是安全的,或者采取措施确保安全,就不会出现问题。这是出于设计:这些库在某种程度上是为了使共享状态的变异变得容易,所以你应该:)@antron啊,对不起。我想我有点夸夸其谈了。不过,我的意思是更广泛的,因为它需要一点纪律,理想情况下需要一个适当的计划,以避免超出最琐碎的场景时出现意外。我将使用互斥体,因此我应该能够避免这些问题。
let handle_login nr (inp,outp) = 
Lwt_io.printl "<Enter your 'nick'name>" >>= Lwt.return(nick := "Jane")