我该使用Either Monad还是ErrorT Monad Transformer?

3
我已经阅读了这个问题,以下是被接受答案的引用:

这个实例已经在 base 4.3.x.x 中添加,该版本与 ghc 7 一起发布。同时,您可以直接使用 Either 实例,或者如果您正在使用 Either 表示可能失败的内容,则应使用 ErrorT Monad 转换器。

我想要像这样使用 Either

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

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

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

1个回答

5

如果符合您的情况,我建议使用Either。一个Either不能满足的例子是,在计算过程中如果你想要执行一些IO操作,例如:

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

在这种情况下, `Either` 是不够的,但是 `ErrorT` 可以解决问题。
我还建议使用 `ExceptT` 而不是 `ErrorT`。 `ErrorT` 依赖于 `Error` 类,这使得它更加难以使用。请参考 ExceptT

好的,在你的例子中我们必须使用一个单子变换器,因为IO单子是单向单子。有EitherT变换器吗? ExceptTEitherT一样工作吗? - Mark Karpov
我的理解是ExceptT是一个EitherT,它被放在transformers和mtl中并得到了“祝福”。我不知道为什么EitherT是个局外人,但我更喜欢ExceptT这个名字。 - user239558
@Mark 在实践中,我可能会使用来自Either包EitherT,因为它已经存在更长时间了。这两个在功能上是等效的。我在我的答案中引用了ExceptT,因为它也来自于transformers,并且是ErrorT被弃用的替代方案。 - Michael Snoyman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接