sha*_*ang 11 haskell monad-transformers
在我目前的项目中,我遇到了将各种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)
("升力"可能是在这里使用的错误术语,但我不确定还有什么可以称之为.)
dan*_*iaz 17
检查出功能hoist从mmorph包.
它的签名是
hoist :: Monad m => (forall a. m a -> n a) -> t m b -> t n b
Run Code Online (Sandbox Code Playgroud)
这意味着它可以改变变压器下面的基础monad.
现在,在trasformers包中,许多"基本"monad被实现为应用于Identitymonad的变换器,如下所示:
type State s = StateT s Identity
Run Code Online (Sandbox Code Playgroud)
因此,我们可以定义以下函数(从文档的Generalizing base monads部分获取mmorph):
import Data.Functor.Identity
generalize :: (Monad m) => Identity a -> m a
generalize m = return (runIdentity m)
Run Code Online (Sandbox Code Playgroud)
并将其与提升机结合使用:
hoist generalize :: (Monad m, MFunctor t) => t Identity b -> t m b
Run Code Online (Sandbox Code Playgroud)
此方法不适用于未定义为变换器的简单monad Identity,如Maybe和Eithermonad.你会被hoistMaybe和hoistEither所困扰.