我正在查看有关haskell monad的教程 我遇到过这种类型:
class (Monad m) => MonadError e m | m -> e where
throwError :: e -> m a
catchError :: m a -> (e -> m a) -> m a
我想知道为什么类型参数是e然后m,我会认为它会是因为当我查看这个类的实例时:
instance MonadError (Either e) where
throwError = Left
(Left e) `catchError` handler = handler e
a `catchError` _ = a
monad构造函数要么首先出现,所以我的问题是为什么在类声明中切换了类型参数?