gpt4 book ai didi

haskell - 理解状态单子(monad)

转载 作者:行者123 更新时间:2023-12-01 09:42:52 24 4
gpt4 key购买 nike

我在“Learn You a Haskell for Great Good”一书中学习了 State monad!米兰利波卡。
对于以下 monad 实例:

instance Monad (State s) where 
return x = State $ \s -> (x,s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState

我无法理解 >>= 的定义功能。我不确定 h是有状态的计算(即接受状态并返回具有更新状态的结果的函数)或它是否是状态。我猜它一定是有状态的计算,因为它被应用于 lambda 函数中的状态(类型为 s)以产生结果 (a, newState) .

但是从 State s a 的类型声明:
newtype State s a = State { runState :: s -> (a,s) }

状态类型为 s结果是 a 类型.所以对于 monad 实例,是 sinstance Monad (State s)状态的类型还是它实际上是有状态的计算?任何见解都值得赞赏。

最佳答案

一个 State对象不存储状态。它存储“状态变化”。实际上它存储了一个函数runState :: s -> (a, s) .这里s是状态的类型,a可以说是“输出”的类型。

因此,该函数将状态作为输入,并返回一个 2 元组 (a, s) .这里第一项是“输出”,第二项是“新状态”。新状态可能与旧状态相同,但因此有机会对状态进行更改(否则无论如何使用 State 并不是很有用)。

我们可以绑定(bind)State -改变对象和状态改变对象的“工厂”(a -> State s b)一起在一个新的State中- 改变对象。因此,我们构造了一个函数,它采用初始状态 s0 .我们首先将其运行到 runStateState对象,从而检索 2 元组 (a, s1) .然后我们可以使用这个a构建 State s b对象,然后我们运行(更改状态)s1通过runState其中State目的。

因此,更详细的实现是:

instance Monad (State s) where 
return x = State $ \s -> (x,s)
(State h) >>= f = State g
where g s0 = (b, s2) -- result of second runState
where (a, s1) = h s0 -- run through first runState
-- create second state with the output of the first
State f' = f a
(b, s2) = f' s1 -- run through second runState

请注意,我们这里实际上从来没有状态值。我们只构建一个新的函数来处理那个状态值。

从示意图上我们可以看到绑定(bind)运算符如下:

s0
\/
| |
| |
||||
|\_________
| '
| s1
v\/
一个 -----> | |
| |
||||
|\_______
| '
s2
b

所以这里是第一个 runState取初始状态 s0将返回 as1 .与 a ,我们构造一个新的 runState ,然后可以处理状态 s1进一步,并将返回 b和新状态 s2 .

关于haskell - 理解状态单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374143/

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