gpt4 book ai didi

haskell - 为什么 state 和 reader monads 函数,而 writer monad 是一个元组?

转载 作者:行者123 更新时间:2023-12-03 22:23:23 24 4
gpt4 key购买 nike

我是 Haskell 新手,我想我了解 monad 及其机制(至少对于列表、状态、也许是 writer 和 reader monad),但我想了解为什么它们会以它们的方式定义,或者为什么它们必须是它们本来的样子,以帮助我凭直觉思考它们。

具体来说,阅读是什么使得阅读器或状态单子(monad)需要成为函数(即 \s -> (a,s) ),而不仅仅是像编写器单子(monad)这样的数据(即 (w,a) )?

此外,可以将 writer monad 用作状态 monad,其中日志用作状态的字符串表示,只要 MonadPlus没有使用功能?与 writer monads 一起使用的 monadic 函数是否允许查看当前日志并随意修改,还是仅允许 writer monad 的 bind 函数查看日志?

另外,为什么单子(monad)是用类型为 a -> m b 的单子(monad)函数定义的? , 而不是类型 m a -> mb ?函数从基本类型变为 monad 包装类型有什么如此自然的地方?

感谢您的回答。

最佳答案

state 和 reader monad 都依赖于我们感兴趣的任何 state 的值。
我们需要能够访问它,否则我们怎么能写出类似的东西

foo = do
i <- get
return $ if i == 1 then 2 else 3
所以我们的 state monad 看起来很自然,就像是接受一个 state,做一些事情,然后产生一个新的东西。
同样对于 reader monad,我们接受一些状态,魔法,并产生一个输出(但没有新状态,因为它是 Reader s a <=> s -> a
现在这与作家单子(monad)非常不同。在 writer 中,我们不关心之前卡在状态中的内容,我们要做的只是获取当前状态,并在其中塞入更多内容。因为我们的状态是一个幺半群,所以我们有一个保证的开始状态 mempty以及在 mappend 中塞满东西的方法.这意味着我们可以在空的上下文中“运行”每个计算,可以这么说,只需将输出融合在一起并获得相同的结果。
好的,现在有几个问题,所以我会一次回答一个
  • 如果 writer monad 可以访问之前写入的结果,那么它将看起来像 s -> (s, a)这是 state monad :) 所以是的,你可以用 state monad 做的任何事情都可以用这个增强的 writer 来完成。
    事实上,StateTWriterT单子(monad)有 MonadPlus实例所以我不确定你在这里得到什么..
  • 由于没有任意函数m a -> a ,我们需要一些方法来展开计算以查看结果 ala >>= ,并且由于 return :: a -> m a让它变得微不足道,从普通值到单值值更普遍。否则我们只会有这些没用的IO String , STM Int以及自 fmap 以来我们在余下的计算中不能依赖的东西不会让我们产生更多的副作用。
  • 关于haskell - 为什么 state 和 reader monads 函数,而 writer monad 是一个元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138928/

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