MonadError section in “All about monads”

大城市里の小女人 提交于 2019-12-31 03:17:10

问题


I'm now really confused about the Error monad in which "All about monads" describes.

It claims the definition of Error monad as

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

And one of the instance is Either e.

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

Here is what I don't understand. The MonadError class take two type parameters, and (Either e) takes one, how is this instantiation work? Is this because the functional dependencies? I still don't get it.

AND! I've runed this code in GHCi(with -XFunctionalDependencies, -XMultiParamTypeClasses) didn't compile! What's is this piece of code, anyway?


回答1:


It's just a typo, the instance should be

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

with two type parameters, as you expected.

Either e is the monad, and e is the corresponding error type.



来源:https://stackoverflow.com/questions/12955415/monaderror-section-in-all-about-monads

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!