gpt4 book ai didi

haskell - 在状态 monad 中使用 put 和 >>

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

摘自用 Haskell 进行函数式思考(第 248 页):

You can think of type State s a as being

type State s a = s -> (a,s) 

...

put :: s -> State s ()
get :: State s s
state :: (s -> (a,s)) -> State s a

... state can be defined using put and get:

state f = do {s <- get; let (a,s') = f s;
put s'; return a}

我相信可以这样重写:

get >>= \s ->
let (a,s') = fs in
put s' >> return a

如果 >> 丢弃其返回值,那么 put s' 的目的是什么?

最佳答案

>> 不会丢弃第一个参数中的所有内容。状态单子(monad)的定义(忽略newtype)

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

因此,第一个参数的状态由 >> 使用,但“返回值”(结果的 x 部分)被忽略。这就是状态单子(monad)的意义所在——跟踪状态的变化,而程序员不必明确考虑它们。

显然,OP 所阅读的内容并没有正确解释这一点,因此您可以通过以下方式导出上面的定义。所有 monad 中 >> 的定义是

a >> b = a >>= \ _ -> b

状态 monad 的 >>= 的定义(忽略 newtypes)是

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

现在,将>>=的定义代入上面>>的定义并简化,我们得到:

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

关于haskell - 在状态 monad 中使用 put 和 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477198/

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