gpt4 book ai didi

haskell - 理解 StateMonad

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

我是一个 haskell 初学者,试图理解 StateMonad 的定义,特别是绑定(bind)操作。取自Generalising Monads to Arrows第 4 页。

instance Monad (StateMonad s) where
return a = SM (\s -> (a, s))
x >>= f = SM (\s -> let
SM x' = x
(a, s') = x' s
SM f' = f a
(b, s'') = f' s'
in (b, s''))

最佳答案

首先需要了解>>=的类型;我假设您这样做了,因为它位于该论文的第 2 页上,并且您已经跳过了。

如果我们定义runState,bind的定义可能会更容易理解。

newtype SM s a = SM (s -> (a, s))

runState :: SM a -> s -> (a, s)
runState (SM f) s = f s
-- this is equivalent to
-- runState (SM f) = f

runState 通过提取转换状态的函数 f 并将其应用于初始状态 s 来运行状态 monad。函数f返回一个(a, s)类型的元组。该元组包含依赖于状态的值(a 类型)和一个新状态(s 类型)。以下是等效的

let (a, s') = runState x s
in ...

let SM x' = x
(a, s') = x' s
in ...

这两者都提取函数x'来了解如何从x转换状态,然后将其应用于初始状态s。生成的元组 (a, s') 包含状态相关值 a 和新状态 s'

我们可以将 >>= 定义中的 SM 模式匹配替换为 runState

 x >>= f = SM (\s -> let
(a, s') = runState x s
(b, s'') = runState (f a) s'
in (b, s''))

现在我们将一点一点地讨论它。

Bind 使用依赖于某些初始状态 s 的函数构造一个新的 StateMonad。它返回一个与状态相关的值b和一个新的状态s'':

 x >>= f = SM (\s -> let
...
in (b, s''))

状态相关值a和新状态s'是通过使用初始状态运行状态单子(monad)x来计算的>s:

                     let
(a, s') = runState x s

新的状态单子(monad)f a是根据用户提供的函数f和状态相关值a确定的。第二个状态 monad 以中间状态 s' 运行。它计算另一个状态相关值 b 和最终状态 s''

                         (b, s'') = runState (f a) s'   

第二个状态相关值 b 和最终状态 s'' 是为新的 StateMonad 构造的函数返回的值。

关于haskell - 理解 StateMonad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821865/

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