我应该使用Ead monad还是ErrorT monad trasformer?

Mar*_*ark 3 haskell monad-transformers either

我读过这个问题.这是被接受的答案的引用:

此实例已添加到基础4.3.xx中,它随ghc 7一起提供.同时,您可以Either直接使用该实例,或者,如果您Either用于表示可能失败的内容,则应使用ErrorTmonad转换器.

我想Either用于这样的事情:

> (Left "bad thing happened") >>= \x -> Right (x ++ " ...")
Left "bad thing happened"
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*man 5

我建议使用Either它是否适合你的情况.它在哪里的例子不会是足够的,如果你想进行一些IO在你的计算,如中间:

x <- mightReturnLeft
y <- liftIO someIOAction
useXandY x y
Run Code Online (Sandbox Code Playgroud)

在那种情况下,Either还不够,但ErrorT会奏效.

另外,我建议使用ExceptT而不是ErrorT.ErrorT依赖于Error使用它更加笨拙的类.