Seção MonadError em “Tudo sobre mônadas”
Agora estou realmente confuso sobre a mónada do erro em que "Tudo sobre mônadas" descreve.
Alega a definição de erro monad como
class (Monad m) => Monaderror e m | m -> e where
throwError :: e -> m a
catchError :: m a -> (e -> m a) -> m a
E uma das instâncias é E e.
instance MonadError (Either e) where
throwError = Left
(Left e) `catchError` handler = handler e
a `catchError` _ = a
Aqui está o que eu não entendo. A classe MonadError toma dois parâmetros de tipo e (Ou e) leva um, como esta instanciação funciona? Isso é porque as dependências funcionais? Eu ainda não entendi.
E! Eu executei este código no GHCi (com -XFunctionalDependencies, -XMultiParamTypeClasses) não compilou! O que é esse pedaço de código, afinal?