是否有用于获取monad的变换器版本的库或类型类?

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

检查出功能hoistmmorph包.

它的签名是

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,如MaybeEithermonad.你会被hoistMaybehoistEither所困扰.