<blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">I have omitted the chunking [Char] because I don&#39;t like it; invariance 
with respect to the chunk sizes is something that should be left to the 
iteratee abstraction.<br>
</blockquote>
<br>
I have this same reservation about iteratees.  And related one for 
enumerators and enumeratees.  Assuming my sense of their intended 
meanings is on track, they allow lots of well-typed but bogus values.<br><br>Defining and adhering to a precise denotational model would eliminate all of these abstraction leaks, as Luke Palmer alludes to in <a href="http://lukepalmer.wordpress.com/2008/07/18/semantic-design/">http://lukepalmer.wordpress.com/2008/07/18/semantic-design/</a> .<br>


<br>
  - Conal<br><br><div class="gmail_quote">On Mon, Aug 23, 2010 at 4:06 PM, Heinrich Apfelmus <span dir="ltr">&lt;<a href="mailto:apfelmus@quantentunnel.de">apfelmus@quantentunnel.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">Conal Elliott wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
For anyone interested in iteratees (etc) and not yet on the iteratees<br>
mailing list.<br>
<br>
I&#39;m asking about what iteratees *mean* (denote), independent of the various<br>
implementations.  My original note (also at the end below):<br>
</blockquote>
<br></div>
In my world view, iteratees are just a monad M with a single operation<br>
<br>
    symbol :: M Char<br>
<br>
that reads the next symbol from an input stream. In other words, they&#39;re a very simple parser monad. The emphasis is not on parsing, but on the fact that one and the same monadic value can be run on different streams<br>


<br>
    runHandle     :: M a -&gt; Handle -&gt; IO a<br>
    runString     :: M a -&gt; String -&gt; a<br>
    runByteString :: M a -&gt; ByteString -&gt; a<br>
<br>
The monad M may also include convenience like exceptions and  liftIO .<br>
<br>
I have omitted the chunking [Char] because I don&#39;t like it; invariance with respect to the chunk sizes is something that should be left to the iteratee abstraction.<br>
<br>
<br>
Regards,<br>
Heinrich Apfelmus<br><font color="#888888">
<br>
--<br>
<a href="http://apfelmus.nfshost.com" target="_blank">http://apfelmus.nfshost.com</a><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">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>
</font></blockquote></div><br>