我正在尝试将(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

最佳答案

忽略ExceptT新类型,您有

IO (Either Error Foo)


而你想要

StateT Bar IO (Either Error Foo)


(我看不到Baz想要什么,因此我忽略了它。)

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

ExceptT . lift . runExceptT


作为Alec noted,可以使用mapExceptT编写:

mapExceptT lift

关于haskell - 在转换器堆栈的中间添加一个monad,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45786924/

10-13 06:09