<br><font size=2 face="sans-serif">Hello,</font>
<br>
<br><tt><font size=2>&gt; &gt; countIO :: String -&gt; String -&gt; Int
-&gt; [a] -&gt; IO [a]<br>
&gt; &gt; countIO msg post step xs = sequence $ map unsafeInterleaveIO
<br>
&gt; ((blank &gt;&gt; outmsg (0::Int) &gt;&gt; c):cs)<br>
&gt; &gt; &nbsp; &nbsp;where (c:cs) = ct 0 xs<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;output &nbsp; = hPutStr stderr<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;blank &nbsp; &nbsp;= output
('\r':take 70 (repeat ' '))<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;outmsg x = output ('\r':msg++show
x) &gt;&gt; hFlush stderr<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ct s ys = let (a,b) = splitAt
(step-1) ys<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;next &nbsp;= s+step<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;in case b of [b1] -&gt; map return a ++ [outmsg <br>
&gt; (s+step) &gt;&gt; hPutStr stderr post &gt;&gt; return b1]<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [] &nbsp; -&gt; map return
(init a) ++ <br>
&gt; [outmsg (s+length a) &gt;&gt; hPutStr stderr post &gt;&gt; return
(last a)]<br>
&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ -&gt; map return a ++
[outmsg s &gt;&gt; <br>
&gt; return (head b)] ++ ct next (tail b)<br>
&gt; <br>
&gt; It wraps a list with IO operations, so that progress can be reported<br>
&gt; while evaluating the list elements. &nbsp;Unfortunately, there seems
to be<br>
&gt; a &quot;stricness leak&quot; here - and consequently, it does not
work on an<br>
&gt; infinite list. <br>
&gt; <br>
Besides anything else, sequence will diverge on an infinite list. This
can be seen directly from the type:</font></tt>
<br>
<br><tt><font size=2>&nbsp; &nbsp; sequence :: Monad m =&gt; [m a] -&gt;
m [a] </font></tt>
<br>
<br><tt><font size=2>It is necessary to compute all of the computations
in the list before returning any of the pure resulting list.</font></tt>
<br>
<br><tt><font size=2>-Jeff</font></tt>
<br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">---</span><br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">This e-mail may contain confidential and/or privileged information. If you </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">are not the intended recipient (or have received this e-mail in error) </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">please notify the sender immediately and destroy this e-mail. Any </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">unauthorized copying, disclosure or distribution of the material in this </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">e-mail is strictly forbidden.</span><br>