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?