Sección MonadError en "Todo sobre las mónadas"

Ahora estoy realmente confundido acerca de la mónada de error en la que se describe "Todo sobre las mónadas".

Afirma la definición de error de la mónada como

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

Y una de las instancias es O bien e.

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

Esto es lo que no entiendo. La clase MonadError toma dos parámetros de tipo y (O) toma uno, ¿cómo funciona esta creación de instancias? ¿Es esto porque las dependencias funcionales? Todavía no lo entiendo.

¡Y! ¡He ejecutado este código en GHCi (con -XFunctionalDependencies, -XMultiParamTypeClasses) no compilé! ¿Cuál es esta pieza de código, de todos modos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta