Установка ссылки на результат Lwt_io.read_line в цепочке связанных потоков - PullRequest
1 голос
/ 15 апреля 2019

Я создаю чат-сервер, и у меня есть функция, которая обрабатывает вход в систему.Существует предустановленный ref, называемый nick, и предустановленный входной поток 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")

Короче говоря, я не знаю, как присваивать переменные значениям, полученным из потоков.

1 Ответ

1 голос
/ 15 апреля 2019

Я не очень знаком с Lwt, но если он работает как любая другая монада, я думаю, что это должно работать:

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)

Но я должен также отметить, что мутирует общее состояниеиз асинхронного кода - это катастрофа, ожидающая своего появления.То, что вы можете сделать это, безусловно, не означает, что вы должны .

...