将错误值提升到ErrorT monad转换器

时间:2012-04-04 17:58:14

标签: haskell monads monad-transformers

我想我对monad变形金刚有一些基本的了解,因为我发现自己编写了这段代码:

import Control.Monad.Identity
import Control.Monad.Error

liftError :: Either String Int -> ErrorT String Identity Int
liftError x = do case x of
                    Right val -> return val
                    Left err -> throwError err

gateway :: Bool -> ErrorT String Identity Int
gateway = liftError . inner

inner :: Bool -> Either String Int
inner True = return 5
inner False = throwError "test"

虽然这有效,但我认为这可以更优雅地完成。特别是,我正在寻找liftError的替代品,我认为我不应该为自己定义。

gatewayinner一起工作而不改变其类型的最简单方法是什么?

1 个答案:

答案 0 :(得分:6)

如果您只是稍微更改一下类型,则根本不需要进行任何提升。

{-# LANGUAGE FlexibleContexts #-}

gateway :: Bool -> ErrorT String Identity Int
gateway = inner

inner :: MonadError String m => Bool -> m Int
inner True = return 5
inner False = throwError "test"

MonadError包含ErrorTEither的实例,因此您可以将inner用作两者。