gpt4 book ai didi

haskell - 'get' 如何在 Haskell 中实际/get/初始状态?

转载 作者:行者123 更新时间:2023-12-04 00:29:47 28 4
gpt4 key购买 nike

我有一个功能:

test :: String -> State String String
test x =
get >>= \test ->
let test' = x ++ test in
put test' >>
get >>= \test2 -> put (test2 ++ x) >>
return "test"

我几乎可以理解整个函数中发生的事情,并且我开始掌握 monads 的窍门。我不明白的是,当我运行这个时:
runState (test "testy") "testtest"

'test' 中的 'get' 函数以某种方式获取初始状态“testtest”。有人可以分解并向我解释吗?

我很感激任何回应!

最佳答案

我原本打算将此作为评论发布,但决定再解释一下。

严格来说,get不“接受”争论。我认为很多正在发生的事情都被你没有看到的东西所掩盖——State monad 的实例定义。
get实际上是 MonadState 类的一个方法。 State monad 是 MonadState 的一个实例,提供了 get 的以下定义:

get = State $ \s -> (s,s)

换句话说, get只返回一个非常基本的 State monad(请记住,monad 可以被认为是计算的“包装器”),其中任何输入 s进入计算将返回一对 s作为结果。

接下来我们需要查看的是 >>= , State 如此定义:
m >>= k  = State $ \s -> let
(a, s') = runState m s
in runState (k a) s'

所以, >>=将产生一个新的计算,在它获得初始状态之前不会被计算(当它们处于“包装”形式时,所有状态计算都是如此)。这个新计算的结果是通过应用 >>= 右侧的任何内容来实现的。运行左侧计算的结果。 (这是一个非常令人困惑的句子,可能需要额外阅读一两次。)

我发现对正在发生的一切“脱糖”非常有用。这样做需要更多的输入,但应该使您的问题的答案( get 的来源)非常清楚。请注意,以下应视为伪代码...
test x =
State $ \s -> let
(a,s') = runState (State (\s -> (s,s))) s --substituting above defn. of 'get'
in runState (rightSide a) s'
where
rightSide test =
let test' = x ++ test in
State $ \s2 -> let
(a2, s2') = runState (State $ \_ -> ((), test')) s2 -- defn. of 'put'
in runState (rightSide2 a2) s2'
rightSide2 _ =
-- etc...

这应该清楚地表明我们函数的最终结果是一个新的状态计算,它将需要一个初始值 ( s) 来完成其余的事情。您提供了 s"testtest"与您的 runState称呼。如果你用“testtest”代替 s在上面的伪代码中,你会看到首先发生的是我们运行 get以“testtest”作为“初始状态”。这产生 ("testtest", "testtest")等等。

这就是 get获取您的初始状态“testtest”。希望这可以帮助!

关于haskell - 'get' 如何在 Haskell 中实际/get/初始状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036957/

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