Daniel Schuessler wrote:

> The thing I don't understand yet is the last line: Why is it OK to discard the
> leftover input from the (f x) Iteratee and yield just the leftover input from
> the first one (m0)?

First of all, the question is about an older version of Iteratee. For
example, the following code 
        http://okmij.org/ftp/Haskell/Iteratee/Iteratee.hs
defines Iteratee a bit differently so the question does not apply.

> data Iteratee a = IE_done a
>                 | IE_cont (Maybe ErrMsg) (Stream -> (Iteratee a,Stream))
>
> instance Monad Iteratee where
>     return = IE_done
>     IE_done a   >>= f = f a
>     IE_cont e k >>= f = IE_cont e (docase . k)
>      where
>      docase (IE_done a, stream)   = case f a of
>                    IE_cont Nothing k -> k stream
>                    i                 -> (i,stream)
>      docase (i, s)  = (i >>= f, s)

No left-over is discarded any more. 

Your question is about the previous design, called `The second design'
described in Iteratee.hs. The corresponding comment block answers your
question, please search for ``Justification for the case IE_done x
s >>= f''.

Please see
        http://okmij.org/ftp/Haskell/Iteratee/IterateeM.hs
for the `production' case of Iteratee in a base monad. The file
IterateeM.hs talks about one more design, and its drawbacks. 

It's all about finding the optimal trade-off, I guess.



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to