gpt4 book ai didi

haskell - Monad 变形金刚升降机

转载 作者:行者123 更新时间:2023-12-02 18:22:31 26 4
gpt4 key购买 nike

我只是在研究现实世界 Haskell 中的 monad 转换器。书上说,要使某个东西成为 monad 转换器,您需要将其设为 MonadTrans 类型类的实例。

因此,本书定义了一个新的 Transformer,即 MaybeT m a 变压器。

他们为这个新的转换器定义了 monadTrans 类型类:

instance MonadTrans MaybeT where
lift m = MaybeT (Just `liftM` m)

然后他们为这个变压器创建了一个 MonadState 实例:

instance (MonadState s m) => MonadState s (MaybeT m) where
get = lift get
put k = lift (put k)

据我了解,lift 函数正在获取底层 monad 并将其包装在正确的构造函数中。但是,我没有在 MonadState 类型类中实现 get 或 put ,我需要一些帮助来理解 lift 在这里实际做什么。我还听说,在 mtl 包中,由于类型类的定义方式,您可以使用 WriterT、StateT 等拥有一堆 monad 转换器,但您可以使用 get、put、tell 等函数,而无需实际执行任何提升。我想知道这是如何工作的,我强烈怀疑它与这些类型类有关,但我不确定?

最佳答案

but you can use functions like get,put,tell etc without actually doing any lifting

这是因为这些函数实际上是在例如MonadState 类型类,而不是 State 类型。

class Monad m => MonadState s m | m -> s where
get :: m s
put :: s -> m ()

然后,StateStateT 都成为该类的实例,这使得使用它们成为可能1

在您的示例实例中,如果我们知道 MaybeT m 的内部 monad 是(满足)MonadState s,我们可以将整个外部 monad 视为 MonadState s 假设我们提升了针对内部 monad 的操作,以便它们适合外部单子(monad),这是通过 lift 完成的。

用简单的英语来说,这听起来像“如果 MaybeT 转换器在某个有状态 (MonadState) monad 上转换(包装)m对于类型 s,生成的类型也是该类型的有状态 monad”。

<小时/>

1这实际上只是一个实例,因为 State s a 实际上是作为 StateT s Identity a 实现的。 Refer to the sources了解实现细节。

关于haskell - Monad 变形金刚升降机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39638546/

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