2

我现在对“所有关于 monads”描述的 Error monad 感到非常困惑。

它声称 Error monad 的定义为

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

其中一个实例是Either e。

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

这是我不明白的。MonadError 类有两个类型参数,(Either e) 有一个,这个实例化是如何工作的?这是因为功能依赖吗?我还是不明白。

和!我在 GHCi 中运行了这段代码(带有 -XFunctionalDependencies,-XMultiParamTypeClasses)没有编译!这段代码到底是什么?

4

1 回答 1

8

这只是一个错字,实例应该是

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

如您所料,使用两个类型参数。

Either e是 monad,e是对应的错误类型。

于 2012-10-18T13:07:23.080 回答