将monad添加到变换器堆栈的中间

时间:2017-08-20 21:23:30

标签: haskell monads monad-transformers

我正在尝试将(ExceptT Error IO Foo)“{半空”给(ExceptT Error (StateT Bar IO) Baz)

我尝试过liftfmap liftfmap return,但没有人工作;这里有标准的习语吗?

> import Control.Monad.Except
> import Control.Monad.State
> data Error
> data Foo
> data Bar
> data Baz
> x = undefined :: ExceptT Error IO Foo
> y = undefined :: (ExceptT Error (StateT Bar IO) Baz) -> a

> f = ??? -- This is what I'm trying to find.

> :t y (f x)
y (f x) :: a

1 个答案:

答案 0 :(得分:5)

忽略ExceptT个新类型,你有

IO (Either Error Foo)

你想要

StateT Bar IO (Either Error Foo)

(我不会在Baz看到你想要的东西,所以我忽略了它。)

那只是lift。所以我相信你应该可以使用

ExceptT . lift . runExceptT

作为Alec noted,可以使用mapExceptT

编写
mapExceptT lift