<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">From: John Millikin &lt;<a href="mailto:jmillikin@gmail.com">jmillikin@gmail.com</a>&gt;<br></blockquote>
<div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On Sat, Aug 21, 2010 at 15:35, Paulo Tanimoto &lt;<a href="mailto:ptanimoto@gmail.com">ptanimoto@gmail.com</a>&gt; wrote:<br>
&gt; Apologies if I&#39;m asking you to repeat yourself, but I couldn&#39;t find<br>
&gt; the explanation.  What was the reason why you went with IterateeM<br>
&gt; instead of IterateeMCPS?  Simplicity?<br>
<br>
Iteratees are difficult enough to understand already -- requiring<br>
prospective users to learn and understand CPS would just be another<br>
roadblock. The CPS implementation is also slower -- I performed some<br>
basic benchmarking of IterateeM.hs and IterateeMCPS.hs, and CPS is<br>
only faster without optimizations. At -O, they are equal, and at -O2,<br>
IterateeM is faster.</blockquote><div><br></div><div>Apologies if this discussion has already moved on; I&#39;m just catching up on weekend email but wanted to respond to this directly.</div><div><br></div><div>It&#39;s not necessary to understand CPS to use CPS-based iteratees. The CPS implementation generally simplifies the types and removes the necessity for special combinators like ($$) and (&gt;&gt;==), so I strongly suspect newcomers will find it easier to use than other variants (although unfortunately I can no longer say this from personal experience). It incorporates the best features of Oleg&#39;s two implementations in IterateeM.hs. The only drawback is the added thought overhead of CPS, but users need not be aware of this for the most part.</div>
<div><br></div><div>For those who do want to have a thorough understanding of the implementation, I think that the CPS variant is usually more understandable than alternatives. The &quot;take&quot; family and stream converters (maps, convStream) are all simplified compared to alternative definitions. This isn&#39;t always true; enumPair is a counterexample. But I think it&#39;s helpful in many common cases, and enumPair is tricky in any implementation.</div>
<div><br></div><div>It might be true that many programmers will find CPS difficult in the abstract (I certainly do), but when it occurs in a specific implementation the concepts are usually much more tractable. At least for iteratees, there&#39;s a very direct correspondence between the CPS-style and IterateeM-style, which greatly eases understanding.</div>
<div><br></div><div>Also, while the IterateeM implementations may be faster for certain operations than CPS, they are also slower for others, sometimes significantly so. My tests (all with -O2, and various other compiler options tried) prior to switching to the CPS implementation showed that it is competitive with, if not being, the fastest implementation in all cases. Most importantly, I didn&#39;t find any comparatively slow operations, which wasn&#39;t true for either of the IterateeM implementations.</div>
<div><br></div><div>I think that a CPS implementation of iteratees is the best of all current alternatives for ease of use, and possibly the best-performing implementation depending on exactly what operations are being performed. Even if it&#39;s not the absolute fastest, it should be close enough that the other benefits outweigh a performance gain.</div>
<div><br></div><div>Cheers,</div><div>John</div></div>