We're being clever and returning from IO not a Char, but a MyMonad Char
(mimp). Then, we run that, which either produces the answer we wanted,
or throws an error in MyMonad.
Thanks. That did the trick! :-)
Regards
However, it's still rather cumbersome, so here's a function similar to
liftError that works for your monad.
-- I'll assume you have such a function
fromIOError :: IOError -> MyErrorType
-- The name is intended to convey that IO errors are caught and
-- reintroduced into MyMonad. Better suggestions welcome.
liftIOTrap :: IO a -> MyMonad a
liftIOTrap io = do mx <- liftIO (do x <- io
return (return x)
`catchError`
(\e -> return (throwError
(fromIOError e))))
mx
foo :: MyMonad a
foo = do
inp <- liftIOTrap (getChar
`catchError`
(\e -> if isEOFError e then return
'\0'
else throwError
e))
...
Andrew
[1] http://haskell.org/pipermail/haskell-cafe/2005-June/010361.html
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe