<blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">There are various models.  One (the state monad model) of them would desugar this to:<br><br>


  \world0 -&gt;<br>
  let (x, world1) = getLine world0<br>
      world2 = print (x+1) world1<br>
      world3 = print (x+2) world2<br>
  in world3<br></blockquote><div><br>Hi Ertugrul,<br><br>This state monad model does not really work for IO, since it fails to capture IO&#39;s concurrency (with non-deterministic interleaving).  I don&#39;t know whether/how the &quot;EDSL model&quot; you mention addresses concurrency or FFI.<br>

<br>So, maybe these models are models of something other (and much less expressive) than Haskell&#39;s IO.  Which re-raises Jerzy&#39;s question.<br><br>Regards,   - Conal<br></div>
<br><div class="gmail_quote">On Mon, Aug 9, 2010 at 10:38 PM, Ertugrul Soeylemez <span dir="ltr">&lt;<a href="mailto:es@ertes.de">es@ertes.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div class="im"><a href="mailto:jerzy.karczmarczuk@info.unicaen.fr">jerzy.karczmarczuk@info.unicaen.fr</a> wrote:<br>
<br>
&gt; Alberto G. Corona  writes:<br>
&gt;<br>
&gt; &gt; (...) Desugarize the &quot;do&quot; notation, after that, desugarize the &gt;&gt;=<br>
&gt; &gt; and &gt;&gt; operators down to the function call notation and suddenly<br>
&gt; &gt; everithing lost its magic because it becomes clear that a haskell<br>
&gt; &gt; monad is a sugarization of plain functional tricks.<br>
&gt;<br>
&gt; Yep.<br>
&gt;<br>
&gt; But, BTW, could you tell me what was the result of the final<br>
&gt; desugarization and the BASIC sense of the IO monad for you?<br>
<br>
</div>Example:<br>
<br>
  do x &lt;- getLine<br>
     print (x+1)<br>
     print (x+2)<br>
<br>
There are various models.  One (the state monad model) of them would<br>
desugar this to:<br>
<br>
  \world0 -&gt;<br>
  let (x, world1) = getLine world0<br>
      world2 = print (x+1) world1<br>
      world3 = print (x+2) world2<br>
  in world3<br>
<br>
Another one (the EDSL model, which I personally prefer) would desugar it<br>
to something as simple as this:<br>
<br>
  GetLine `BindIO` \x -&gt;<br>
  Print (x+1) `BindIO`<br>
  const (Print (x+2))<br>
<br>
I wonder if there are more models for IO.<br>
<br>
<br>
Greets,<br>
Ertugrul<br>
<font color="#888888"><br>
<br>
--<br>
nightmare = unsafePerformIO (getWrongWife &gt;&gt;= sex)<br>
<a href="http://ertes.de/" target="_blank">http://ertes.de/</a><br>
</font><div><div></div><div class="h5"><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>