gpt4 book ai didi

haskell - 再来一次……我可以举一个状态单子(monad)的例子吗?

转载 作者:行者123 更新时间:2023-12-02 02:48:56 25 4
gpt4 key购买 nike

我试图了解读者和/或状态单子(monad)的实际需求。我见过的所有示例(包括许多在 stackoverflow 上的示例,因为我一直在寻找可以使用的合适示例以及在各种书籍和博客文章中)的形式(伪代码)

 f = do
foo <- ask
do something with foo

g = do
foo <- ask
do something else using foo

h = runReader
(
f
g
)

换句话说,调用两个函数并(大概)从一个调用到下一个调用保持某种状态。但是,我不觉得这个例子特别有说服力,因为(我认为)我可以让 f 返回一些状态,然后将该状态传递给 g。

我希望看到一个示例,使用单个整数(例如)作为要保留的状态,而不是从中心位置对 f 和 g 的两次连续调用,而是对 f 的调用,然后在内部调用 g然后在主例程中更改了可用的状态(如果是状态单子(monad))。

我见过的大多数(实际上是所有)示例都花费了大量时间关注 monad 的定义,然后展示了如何设置单个函数调用。对我来说,这将是进行嵌套调用并让状态随身携带以证明它为什么有用的能力。

最佳答案

这是一个有状态子程序调用另一个有状态子程序的重要示例。

import Control.Monad.Trans.State

f :: State Int ()
f = do
r <- g
modify (+ r)

g :: State Int Int
g = do
modify (+ 1)
get

main = print (execState f 4)

在本例中,初始状态从 4 开始。状态计算从 f 开始. f内部调用 g ,将状态增加到 5然后返回当前状态(仍然是 5 )。这会将控制权恢复到 f ,它绑定(bind)值 5r然后将当前状态增加 r , 最终状态为 10 :
>>> main
10

关于haskell - 再来一次……我可以举一个状态单子(monad)的例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577066/

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