3

我读过这个问题。以下是已接受答案的引用:

此实例已添加到 ghc 7 附带的 base 4.3.xx 中。同时,您可以Either直接使用该实例,或者,如果您Either用于表示可能失败的内容,则应使用ErrorTmonad 转换器。

我想Either用于这样的事情:

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

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

实际问题是:为什么我应该使用ErrorTmonad 转换器而不是Eithermonad?我是 Haskell 的新手,我有点害怕 monad 转换器,尤其是当我已经在其中编写代码时。

4

1 回答 1

5

Either如果它适合您的情况,我会建议使用。如果您想在计算过程中执行一些操作,那么这不够的一个示例IO,例如:

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

在这种情况下,Either这还不够,但ErrorT会起作用。

另外,我建议使用exceptT而不是ErrorT. ErrorT依赖于Error使其使用起来更加尴尬的类。

于 2014-10-14T10:53:49.287 回答