我应该使用Ead monad还是EfforT monad变压器?

时间:2014-10-14 09:31:05

标签: haskell monad-transformers either

我已阅读this question。以下是对已接受答案的引用:

  

此实例已添加到基础4.3.xx中,它随ghc 7一起提供。同时,您可以直接使用Either实例,或者,如果您使用Either来表示可能的内容你应该使用ErrorT monad transformer。

我想将Either用于这样的事情:

> (Left "bad thing happened") >>= \x -> Right (x ++ " ...")
Left "bad thing happened"

因此,如果计算的一部分失败,则返回其Left

实际问题是:我为什么要使用ErrorT monad变换器而不是Either monad?我是Haskell的新手,我有点害怕monad转换器,特别是当我已经在其中编写代码时。

1 个答案:

答案 0 :(得分:5)

如果适合您的情况,我建议您使用Either足够的一个例子是你想在计算过程中执行一些IO,例如:

x <- mightReturnLeft
y <- liftIO someIOAction
useXandY x y

在这种情况下,Either是不够的,但ErrorT可行。

另外,我建议使用ExceptT代替ErrorTErrorT依赖于Error类,这使得使用它更加笨拙。