MonadError section in “All about monads”

2019-02-27 13:28发布

问题:

I'm now really confused about the Error monad in which "All about monads" describes.

It claims the definition of Error monad as

class (Monad m) => Monaderror e m | m -> e where
  throwError :: e -> m a
  catchError :: m a -> (e -> m a) -> m a

And one of the instance is Either e.

instance MonadError (Either e) where
  throwError = Left
  (Left e) `catchError` handler = handler e
  a        `catchError` _       = a

Here is what I don't understand. The MonadError class take two type parameters, and (Either e) takes one, how is this instantiation work? Is this because the functional dependencies? I still don't get it.

AND! I've runed this code in GHCi(with -XFunctionalDependencies, -XMultiParamTypeClasses) didn't compile! What's is this piece of code, anyway?

回答1:

It's just a typo, the instance should be

instance MonadError e (Either e) where
  throwError = Left
  (Left e) `catchError` handler = handler e
  a        `catchError` _       = a

with two type parameters, as you expected.

Either e is the monad, and e is the corresponding error type.