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?

questionAnswers(1)

yourAnswerToTheQuestion