我现在对“所有关于 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)没有编译!这段代码到底是什么?