Andreas Gruenbacher
Mon, 19 Mar 2001 18:43:55 +0100 (CET)

On Mon, 19 Mar 2001, Simon Peyton-Jones wrote:

> Lazy evaluation *is* coroutines, in a way.

What I had in mind was something like the following (pseudocode), which
could easily be implemented on top of coroutines:

class Channel c t where
	send    :: t -> c -> IO ()
	receive ::      c -> IO t

sender :: Int -> Channel -> ...
sender n receiver = do send n receiver
                       return (sender (n+1) receiver)

receiver :: Channel -> ...
receiver sender = do i <- receive sender
                     return (receiver sender)

c :: Channel Int
c = ...

main = run_them [ sender 1 c, receiver c ]

Maybe there is also a way to achieve something similar using higher order
functions---I just don't see how.

> Or you may be interested in Concurrent Haskell
> See section 4 of "Tackling the awkward squad"

Thanks, I'm chewing on this paper of yours since a couple of days already.
I particularly like the introduction to monads---it's the best I have seen
so far.