Check out ErrorT in Control.Monad.Error > :t ErrorT ErrorT :: m (Either e a) -> ErrorT e m a
> :info ErrorT instance (Monad m, Error e) => Monad (ErrorT e m) > :info Error class Error e where noMsg :: e strMsg :: String -> e So, if you can make your Error type an instance of this class, you can do this: runCalc = runErrorT (ErrorT (func1 p) >>= ErrorT . func2) The restriction to the typeclass Error is to allow implementation of the "fail" method in Monad. -- ryan 2010/5/1 Eugeny N Dzhurinsky <b...@redwerk.com>: > Hello! > > I have some sort of strange question: > > assume that there are 2 functions > > func1 :: Int -> IO (Either Error String) > func2 :: String -> IO (Either Error [String]) > > in case if there will be no IO involved, I could use > Control.Monad.Either and write something like > > runCalc :: Int -> IO (Either Error [String]) > runCalc param = func1 param >>= func2 > > but with that IO stuff I can't simply do in this way. Can somebody please > suggest, how to combine IO and Either monads, if that's even possible? > > Thank you in advance! > > -- > Eugene Dzhurinsky > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe