"callbacks" in Haskell
Tom Pledger
Tom.Pledger@peace.com
Thu, 26 Jun 2003 08:44:38 +1200
Robert Vollmert writes:
| Hello,
|
| I've been having a little trouble writing a module that waits for and
| handles IO events, e.g. by reading from a pipe. It seemed natural to
| use some form of callbacks here, though that may very well be the
| wrong approach. I'd be happy to hear of alternatives.
|
| Anyway, I got a callback-based approach to work to some extent, but
| am not happy with the callback's type.
:
Can the event and handler inhabit the same monad, say IO? If so, is
the following the sort of thing you had in mind?
waitAndHandleOneEvent :: IO e -> (e -> IO ()) -> IO ()
waitAndHandleOneEvent ioe h = forkIO (do e <- ioe
h e)
But then, because ioe and h always get combined the same way (ioe >>=
h), we can generalise waitAndHandleOneEvent to
waitAndDoOneThing :: IO () -> IO ()
waitAndDoOneThing io = forkIO io
which is equivalent to using forkIO directly, as in
do ...
let ioe :: IO MyEvent
ioe = ...
h :: MyEvent -> IO ()
h e = ...
forkIO (ioe >>= h)
...
HTH.
Tom