Sekcja MonadError w „Wszystko o monadach”

Jestem teraz bardzo zmieszany co do monady błędu, w której opisuje się „Wszystko o monadach”.

Twierdzi, że definicja błędu monad jako

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

A jednym z przykładów jest albo e.

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

Oto, czego nie rozumiem. Klasa MonadError pobiera dwa parametry typu i (Albo e) bierze jeden, jak działa ta instancja? Czy to z powodu zależności funkcjonalnych? Nadal tego nie rozumiem.

I! Uruchomiłem ten kod w GHCi (z -XFunctionalDependencies, -XMultiParamTypeClasses) nie skompilował się! Co to w ogóle jest ten kod?

questionAnswers(1)

yourAnswerToTheQuestion