Commits

Anonymous committed c54c181

lwt: io/threads explained

  • Participants
  • Parent commits dcc80ff

Comments (0)

Files changed (1)

 
     type m 'a = (unit -> 'a)
 
-  , либо монада, основанная на lwt (однако, нужно учитывать, что lwt это
-не IO-монада, а thread-монада, то есть, работает над легковесными
-потоками, а не над значениями ввода-вывода).
+  , либо монада, основанная на lwt.
+
+  Однако, нужно учитывать, что lwt это не IO-монада, а thread-монада,
+то есть, lwt работает над легковесными нитями, а не над значениями
+ввода-вывода.  Каждое значение с типом "Lwt.t 'a" является нитью,
+а не действием ввода-вывода, и, если данное значение может быть
+вычислено, то оно будет вычислено раз и навсегда.  В случаях,
+когда с помощью lwt необходимо записывать действия ввода-вывода,
+необходимо обеспечить создание новой нити (нового значения с типом
+"Lwt.t 'a") каждый раз, когда требуется совершить действие ввода-вывода.
+То есть, вместо
+
+    value my_io = Lwt_io.write oc str >>% fun () -> ...;
+
+  нужно сделать
+
+    value my_io () = Lwt_io.write oc str >>% fun () -> ...;
+
+  , чтобы нить, равная "Lwt_io.write ..." создавалась каждый раз при
+вызове "my_io ()", и каждый раз завершалась, выводя заданную строку в
+заданный канал.
+
 
   Но итераты сами по себе образуют монаду со своими операциями
 "погружения" и "привязки" -- например, итерат, разбирающий две строки