我对MonadError
有疑问,即最好不要使用MonadError
,而要使用Except
?
Except
和MonadError
不互斥。它们是不同种类的东西。
Except
是类型类(即“接口”),它定义了某些操作(MonadError
和throwError
),这些操作可以由不同的monad实现。如果函数的类型签名要求catchError
,则表示“只要实现MonadError
,我就可以在任何monad中工作,因为我使用了其中定义的操作”,例如:
MonadError
f :: MonadError m => Int -> m String
,另一方面,是具有特定基础实现的特定monad。这个特定的monad恰好实现了Except
中的操作,这意味着可以在MonadError
中使用任何需要MonadError
的功能:
Except
您还可以声明要在runExcept $ f 42 -- using the definition of `f` above
中专门使用的函数,而不是“在实现Except
的任何东西中都使用”:
MonadError
[像g :: Int -> Except MyErrorType String
可以这样,仍可以在Except
中使用该功能:
f
但是不能在实现runExcept $ g 42
的other单子中使用。