[Haskell-cafe] Question about the Monad instance for Iteratee (from the enumerator package)

Daniel Schüssler anotheraddress at gmx.de
Tue Apr 19 14:27:47 CEST 2011


Hello,

for reference, said instance is:

> instance Monad m => Monad (Iteratee a m) where
> 	return x = yield x (Chunks [])
> 
> 	m0 >>= f = ($ m0) $ fix $
> 		\bind m -> Iteratee $ runIteratee m >>= \r1 ->
> 			case r1 of
> 				Continue k -> return (Continue (bind . k))
> 				Error err -> return (Error err)
> 				Yield x (Chunks []) -> runIteratee (f x)
> 				Yield x extra -> runIteratee (f x) >>= \r2 ->
> 					case r2 of
> 						Continue k -> runIteratee (k extra)
> 						Error err -> return (Error err)
> 						Yield x' _ -> return (Yield x' extra)

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)?

Cheers,
Daniel



More information about the Haskell-Cafe mailing list