[Haskell-cafe] Re: Fwd: Semantics of iteratees, enumerators, enumeratees?

Heinrich Apfelmus apfelmus at quantentunnel.de
Tue Aug 24 03:31:17 EDT 2010

Conal Elliott wrote:
> Is there a simpler model of Enumerator? My intuition is that it's simply a
> stream:
>> [[Enumerator a]] = String
> Oddly, 'a' doesn't show up on the RHS.  Maybe the representation ought to be
>> type Enumerator = forall a. Iteratee a -> Iteratee a
> so
>> [[Enumerator]] = String

I concur, that seems to be all there is to it.

There is a small nuance in the Iteratee implementation, namely: if an 
Enumerator is something that provides a complete input stream to an 
Iteratee, why isn't it simply defined as

     type Enumerator = forall a. Iteratee a -> a

i.e. as a function that runs an Iteratee on an input stream and extracts 
the result? I think the purpose of the implementation

     type Enumerator = forall a. Iteratee a -> Iteratee a

is that it allows us to concatenate different input streams. In other words

     fromString (xs ++ ys) = fromString ys . fromString xs

assuming a function

     fromString :: String -> Enumerator

To get an actual result from an Iteratee, we only need a way to run it 
on the empty stream.

     runOnEmptyString :: Iteratee a -> Maybe a

Heinrich Apfelmus


More information about the Haskell-Cafe mailing list