gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:51:37 25 4
gpt4 key购买 nike

在我当前的项目中,我遇到了将各种 monad 转换为它们的转换器对应物的需求,例如

stateT :: Monad m => State s a -> StateT s m a
stateT stf = StateT $ return . runState stf

为我需要的 monad 编写这些实用函数很简单,但我想知道是否已经存在一个包含标准 monad 的此功能的库,也许还有一个抽象这种转换的类型类。就像是
class (Monad f, MonadTrans t) => LiftTrans f t | f -> t where
liftT :: Monad m => f a -> t m a

(“提升”在这里可能是错误的术语,但我不知道还能叫什么。)

最佳答案

checkout 功能hoist来自 mmorph包裹。

它的签名是

hoist :: Monad m => (forall a. m a -> n a) -> t m b -> t n b

这意味着它可以改变变压器底层的基本单子(monad)。

现在,在 trasformers包中,许多“基本” monad 被实现为应用于 Identity 的转换器。单子(monad),像这样:
type State s = StateT s Identity

因此,我们可以定义以下函数(取自 mmorph 文档的 Generalizing base monads 部分):
import Data.Functor.Identity

generalize :: (Monad m) => Identity a -> m a
generalize m = return (runIdentity m)

并将其与葫芦结合起来:
hoist generalize :: (Monad m, MFunctor t) => t Identity b -> t m b

此方法不适用于未定义为应用于 Identity 的转换器的简单 monad。 ,如 MaybeEither单子(monad)。你被 hoistMaybe 卡住了和 hoistEither对于这些。

关于haskell - 是否有用于获取 monad 的转换器版本的库或类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20066858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com