Le samedi 17 septembre 2011 à 09:38 +0300, Dmitry Grebeniuk a écrit : > When I began to use Lwt, I was badly surprised > by the fact that Lwt.t values are not real I/O actions. > So I had to get a new habit: if the top-level module > value has type Lwt.t 'a, I have to defer its > computation by wrapping it under "fun () -> <expr>". > And I have to remember which of my functions return > Lwt.t values, which of my abstract types really have > type Lwt.t 'a or contain the Lwt.t 'a values, to defer > their computations/sideeffects too.
You are comparing Lwt with the IO monad. They are two different monads: IO deals with actions while Lwt deals with threads. If you write: let m = IO.read_char IO.stdin then [m] is just the description of the action of reading a character from [stdin]. On the contrary, if you write: let m = Lwt_io.read_char Lwt_io.stdin then [m] is really a thread waiting for a character from [stdin]. If you use "fun () -> ..." everywhere then this becomes actions but it is not threads anymore and you loose most of the advantages of Lwt. For example with Lwt you can write: let t1 = f1 () and t2 = f2 () ... and tn = fn () in Lwt.bind t1 (fun x1 -> Lwt.bind t2 (fun x2 -> ... Lwt.bind tn (fun xn -> return (x1, x2, ..., xn)) ...)) and this will let [t1], ..., [tn] run concurrently. With the IO monad this is just exactly the same as: let x1 = f1 () in let x2 = f2 () in ... let xn = fn () in (x1, x2, ..., xn) in a non-monadic world. There is no concurrency at all. Cheers, -- Jérémie -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
