Thanks for the detailed response below...<div><br></div><div>I must be able to understand how the resources will be used in my system for mission-critical, long-running applications.</div><div><br></div><div>Dave<br><br><div class="gmail_quote">
On Thu, Feb 4, 2010 at 12:51 PM, John Millikin <span dir="ltr">&lt;<a href="mailto:jmillikin@gmail.com">jmillikin@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Both have advantages and disadvantages. The primary advantage of lazy<br>
IO over iteratees is that it&#39;s much, *much* easier to understand --<br>
existing experience with monads can be used immediately. The downsides<br>
of lazy IO, of course, are well documented[1][2][3].<br>
<br>
Some are fixed by the safe/strict IO packages. However, safe lazy IO<br>
is still &quot;unpredictable&quot; in that it&#39;s difficult to know how many<br>
resources will be used, the order of some operations (eg, releasing<br>
handles), or whether some particular expression will throw an<br>
exception.<br>
<br>
Iteratees are useful because the author can make and verify guarantees<br>
about performance (eg, &quot;this code will never read more than 4 KiB at<br>
once&quot;). They also allow pure code to determine the behavior of IO,<br>
safely, which is useful when writing libraries which must deal with<br>
large amounts of data (eg, streaming a file over HTTP). The Hyena web<br>
server is written using iteratees, and from what I&#39;ve heard the<br>
authors have been quite happy with their properties.<br>
<br>
I&#39;ve also found iteratees to perform somewhat better than lazy IO,<br>
though I don&#39;t know why.<br>
<br>
Downside: iteratees are very hard to understand. I wrote a<br>
decently-sized article about them[4] trying to figure out how to make<br>
them useful, and some comments in one of Oleg&#39;s implementations[5]<br>
suggest that the &quot;iteratee&quot; package is subtly wrong. Oleg has written<br>
at least three versions (non-monadic, monadic, monadic CPS) and I&#39;ve<br>
no idea why or whether their differences are important. Even dons says<br>
he didn&#39;t understand them until after writing his own iteratee-based<br>
IO layer[6].<br>
<br>
tl;dr: Lots of smart people, with a history of being right about this<br>
sort of thing, say iteratees are better. Evidence suggests<br>
iteratee-based IO is faster and more predictable than lazy IO.<br>
Iteratees are really hard to understand.<br>
<br>
[1] <a href="http://okmij.org/ftp/Haskell/Iteratee/Lazy-vs-correct.txt" target="_blank">http://okmij.org/ftp/Haskell/Iteratee/Lazy-vs-correct.txt</a><br>
[2] <a href="http://www.kuliniewicz.org/blog/archives/2010/01/27/happstack-and-streaming-part-4-the-flaw/" target="_blank">http://www.kuliniewicz.org/blog/archives/2010/01/27/happstack-and-streaming-part-4-the-flaw/</a><br>

[3] <a href="http://forums.xkcd.com/viewtopic.php?f=11&amp;t=46780" target="_blank">http://forums.xkcd.com/viewtopic.php?f=11&amp;t=46780</a><br>
[4] <a href="http://ianen.org/articles/understanding-iteratees/" target="_blank">http://ianen.org/articles/understanding-iteratees/</a><br>
[5] <a href="http://okmij.org/ftp/Haskell/Iteratee/IterateeM.hs" target="_blank">http://okmij.org/ftp/Haskell/Iteratee/IterateeM.hs</a> , search for<br>
&quot;Drawbacks of this encoding&quot;<br>
[6] <a href="http://stackoverflow.com/questions/1319705/introduction-or-simple-examples-for-iteratee" target="_blank">http://stackoverflow.com/questions/1319705/introduction-or-simple-examples-for-iteratee</a><br>
<div><div></div><div class="h5"><br>
On Thu, Feb 4, 2010 at 08:29, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com">leimy2k@gmail.com</a>&gt; wrote:<br>
&gt; Hi everyone,<br>
&gt; This is not an attempt to start a flame war.  I&#39;m just trying to get a good<br>
&gt; feel for the advantages and disadvantages of the newer safe lazy io lib<br>
&gt; available on Hackage vs using Iteratee.<br>
&gt; It does appear to me that using something like Itereatee gives a bit of room<br>
&gt; to really tweak the low level enumerator/iteratee relationship, and, if you<br>
&gt; asked my old boss, I&#39;m just a big fan of folds too, I use them a lot in my<br>
&gt; Erlang :-), so Iteratee really does appeal to me on many levels.<br>
&gt; Yet at the same time, I&#39;m quite enamored with the beauty of &quot;interact&quot; and<br>
&gt; functions of that sort.  I realize mixing the effects of the lazy IO and<br>
&gt; pure code may not be the clearest way to write code for everyone, but there<br>
&gt; is something about being able to get linewise data as<br>
&gt; interact (unlines . fmap someLineWiseFunction . lines)<br>
&gt; that is just kind of cool.<br>
&gt; Dave<br>
</div></div>&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">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></div>