问题
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.
来源:https://stackoverflow.com/questions/12955415/monaderror-section-in-all-about-monads