[Haskell-cafe] Using MonadError within other Monads
andrew at pimlott.net
Mon Dec 19 15:30:01 EST 2005
On Mon, Dec 19, 2005 at 10:21:36PM +1300, Karl Grapone wrote:
> I still find monadic signatures a little confusing, I believe ghci
> was, at some point, deriving types for f or g that had MonadError in
> place of Either String, so I'll have to think carefully about why it
> is so different from the ErrorT type you show below.
You used throwError, which is a MonadError method, so it's not
surprising to get a message about MonadError. Regarding ErrorT...
> At one point I was playing with types like 'Either String (IO
> String)', which to me seems very similar to the ErrorT type.
Actually, your type
IO (Either String String)
is the same as
ErrorT String IO String
except for the newtype wrapper. The big difference in use is that the
"ErrorT String IO" Monad instance combines the monad structures of IO
and Either. So you won't need nested do's, and a few other things will
have to change (and you might have to think a bit about mapErrs).
> Intuitively they don't seem like they'd be correct... I feel like
> determining that there is an error involves interaction with the
> outside world, consequently the error part should be inside the IO
You're correct about that--"Either String (IO String)" is not a monad.
More information about the Haskell-Cafe