在我目前的项目中,我遇到了将各种monad变成变压器对应物的需求,例如
stateT :: Monad m => State s a -> StateT s m a
stateT stf = StateT $ return . runState stf
Run Code Online (Sandbox Code Playgroud)
为我需要的monad编写这些实用程序函数是微不足道的,但我想知道是否已经存在一个包含标准monad的这个功能的库,也许是一个抽象这种转换的类型类.就像是
class (Monad f, MonadTrans t) => LiftTrans f t | f -> t where
liftT :: Monad m => f a -> t m a
Run Code Online (Sandbox Code Playgroud)
("升力"可能是在这里使用的错误术语,但我不确定还有什么可以称之为.)
我正试图"半空" (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) …Run Code Online (Sandbox Code Playgroud)