gpt4 book ai didi

haskell - 理解状态单子(monad)

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

Learn You a HaskellState 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 s 的类型和 g newState在右下方。

你能解释一下他们的类型和发生了什么吗?

最佳答案

State s a是一个函数的命名---“状态转换函数”

s -> (a, s)

换句话说,它需要一个输入状态 s并在返回结果的同时修改该状态, a .这形成了一个真正通用的“纯状态”框架。如果我们的状态是一个整数,我们可以编写一个函数来更新该整数并返回新值——这就像一个唯一的数字源。
upd :: Int -> (Int, Int)
upd s = let s' = s + 1 in (s', s')

在这里, as最终成为同一类型。

现在这一切都很好,只是如果我们想获得两个新号码就麻烦了。为此,我们必须以某种方式运行 upd两次。

最终结果将是另一个状态转换器功能,因此我们正在寻找“状态转换器转换器”。我称它为 compose:
compose :: (s -> (a, s))         -- the initial state transformer
-> (a -> (s -> (b, s))) -- a new state transformer, built using the "result"
-- of the previous one
-> (s -> (b, s)) -- the result state transformer

这看起来有点毛茸茸,但老实说,编写这个函数相当容易。这些类型将引导您找到答案:
compose f f' = \s -> let (a, s')  = f s
(b, s'') = f' a s'
in (b, s'')

您会注意到 s -类型变量, [s, s', s''] “向下流动”表示状态从第一次计算通过第二次计算移动到结果。

我们可以使用 compose使用 upd 构建一个获取两个唯一数字的函数
twoUnique :: Int -> ((Int, Int), Int)
twoUnique = compose upd (\a s -> let (a', s') = upd s in ((a, a'), s'))

这些是 State 的基础知识.唯一的区别是我们认识到 compose 内部有一个共同的模式。函数,我们提取它。那个图案看起来像
(>>=) :: State s a     -> (a -> State s b   ) -> State s b
(>>=) :: (s -> (a, s)) -> (a -> (s -> (b, s)) -> (s -> (b, s))

它也以相同的方式实现。我们只需要“包装”和“解包” State bit---这就是 State的目的和 runState
State    :: (s -> (a, s)) -> State s a
runState :: State s a -> (s -> (a, s))

现在我们可以采取 compose并将其与 (>>=) 进行比较
compose f f'       =         \s -> let (a, s')  = f s
(b, s'') = f' a s'
in (b, s'')

(>>=) (State f) f' = State $ \s -> let (a, s') = f s
(b, s'') = runState (f' a) s'
in (b, s'')

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

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