我正在尝试将(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
答案 0 :(得分:5)
忽略ExceptT
个新类型,你有
IO (Either Error Foo)
你想要
StateT Bar IO (Either Error Foo)
(我不会在Baz
看到你想要的东西,所以我忽略了它。)
那只是lift
。所以我相信你应该可以使用
ExceptT . lift . runExceptT
作为Alec noted,可以使用mapExceptT
:
mapExceptT lift