How do I read &quot;IO is not lazy&quot; ?<br>&nbsp;Is IO (&gt;&gt;=) forcing the evaluation of its arguments, causing the unwanted neverending loop?<br>And, this happens even in (MonadTrans t =&gt; t IO)&nbsp; (&gt;&gt;=) ?<br><br>
Thanks<br><br>paolino<br><br><div class="gmail_quote">2008/12/31 Ryan Ingram <span dir="ltr">&lt;<a href="mailto:ryani.spam@gmail.com" target="_blank">ryani.spam@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

IO is not lazy; you never make it to &quot;print&quot;.<br>
<br>
Consider this program:<br>
<br>
&gt; k = f 0 where<br>
&gt; &nbsp; &nbsp;f n = do<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;lift (print n)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;tell [n]<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;f (n+1)<br>
<br>
&gt; weird :: IO [Int]<br>
&gt; weird = do<br>
&gt; &nbsp; &nbsp; (_, ns) &lt;- runWriterT k<br>
&gt; &nbsp; &nbsp; return (take 20 ns)<br>
<br>
What should &quot;weird&quot; print? &nbsp;According to &quot;k&quot;, it prints every Int from<br>
0 up. &nbsp;Aside from the extra printing, it has the same behavior as your<br>
writer.<br>
<br>
For the result of a WriterT to be lazy readable, you need both the<br>
monoid to be lazy readable, and the transformed monad to be lazy,<br>
which IO isn&#39;t.<br>
<br>
 &nbsp;-- ryan<br>
<br>
2008/12/31 Paolino &lt;<a href="mailto:paolo.veronelli@gmail.com" target="_blank">paolo.veronelli@gmail.com</a>&gt;:<br>
<div><div></div><div>&gt; As someone suggested me, I can read the logs from Writer and WriterT as<br>
&gt; computation goes by,<br>
&gt; if the monoid for the Writer &nbsp;is lazy readable.<br>
&gt; This has been true until I tried to put the IO inside WriterT<br>
&gt;<br>
&gt;<br>
&gt;&gt; {-# LANGUAGE FlexibleContexts #-}<br>
&gt;&gt; import Control.Monad.Writer<br>
&gt;<br>
&gt;<br>
&gt;&gt; k :: (MonadWriter [Int] m) =&gt; m [Int]<br>
&gt;<br>
&gt;&gt; k = let f x = tell [x] &gt;&gt; f (x + 1) in f 0<br>
&gt;<br>
&gt;<br>
&gt;&gt; works :: [Int]<br>
&gt;&gt; works = snd $ runWriter k<br>
&gt;<br>
&gt;<br>
&gt;&gt; hangs :: IO [Int]<br>
&gt;&gt; hangs = snd `liftM` runWriterT k<br>
&gt;<br>
&gt;<br>
&gt;&gt; main = take 20 `liftM` hangs &gt;&gt;= print<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; The main hangs both interpreted and compiled on ghc 6.10.1.<br>
&gt;<br>
&gt; The issue is not exposing with IO alone as<br>
&gt;<br>
&gt; main = print &quot;test&quot; &gt;&gt; main<br>
&gt;<br>
&gt; is a working program.<br>
&gt;<br>
&gt; Thanks for explanations.<br>
&gt;<br>
&gt;<br>
&gt; paolino<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
&gt;<br>
</blockquote></div><br>