MonadError应该不再使用了?

问题描述 投票:0回答:1

我对MonadError有疑问,即最好不要使用MonadError,而要使用Except

haskell
1个回答
1
投票

ExceptMonadError不互斥。它们是不同种类的东西。

Except是类型类(即“接口”),它定义了某些操作(MonadErrorthrowError),这些操作可以由不同的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单子中使用。

© www.soinside.com 2019 - 2024. All rights reserved.