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

Nat*_*ngo 2 monads haskell monad-transformers

我正试图"半空" (ExceptT Error IO Foo)到一个(ExceptT Error (StateT Bar IO) Baz).

我试过了lift,fmap lift而且fmap 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
Run Code Online (Sandbox Code Playgroud)

dfe*_*uer 5

忽略新ExceptT类型,你有

IO (Either Error Foo)
Run Code Online (Sandbox Code Playgroud)

你想要的

StateT Bar IO (Either Error Foo)
Run Code Online (Sandbox Code Playgroud)

(我不明白你想要什么Baz,所以我忽略了它.)

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

ExceptT . lift . runExceptT
Run Code Online (Sandbox Code Playgroud)

正如Alec所说,这可以用以下方式编写mapExceptT:

mapExceptT lift
Run Code Online (Sandbox Code Playgroud)