gpt4 book ai didi

haskell - 为什么 runState 签名只有状态参数?

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

一个现实生活中的例子:如果我心情好('good state'),当经理问我估计时,我给他一个可靠的答案,但他敢这样做3次连续 ,中间没有一些免费的零食,我的情绪发生了变化(我进入了“糟糕的状态”),接下来的 3 次他接近我要求他不要用他的任何废话来打扰我。

这是我平时的日志:

                             [ Mood: Good, Patience: 3 ]  -- 11:00 am, I'm happy
ESTIMATE -> "bla bla 6", [ Mood: Good, Patience: 2 ]
ESTIMATE -> "bla bla 1", [ Mood: Good, Patience: 1 ]
Cookies! -> "", [ Mood: Good, Patience: 3 again! ]
ESTIMATE -> "bla bla 7", [ Mood: Good, Patience: 2 ]
ESTIMATE -> "bla bla 2", [ Mood: Good, Patience: 1 ]
ESTIMATE -> "bla bla 9", [ Mood: BAD , Patience: -2 ] -- Enough!
ESTIMATE -> "Need a break!" [ Mood: BAD , Patience: -1 ]
ESTIMATE -> "Deploynig!", [ Mood: BAD , Patience: 0 ]
ESTIMATE -> "Lunch time!", [ Mood: Good, Patience: 3 ] -- Ok he needs me..
ESTIMATE -> "bla bla 6", [ Mood: Good, Patience: 2 ]
...

现在我在工作中的这个模型似乎适合 State单子(monad)。
newtype State s a = State { runState :: s -> (a, s) } 

但是我该怎么做呢?签名有一个状态的空间,在我的例子中是 (Mood,Patience) ,而不是用于输入( ESTIMATECookies )。这就像我应该不听就回答!

所以我的问题是: 如何使用 State 不仅进行有状态计算而且还进行有争议的计算Haskell的单子(monad)?

最佳答案

有状态计算获取输入、状态并返回输出和新状态。所以类型将是 input -> state -> (state, output) .
runState只是一个部分应用的有状态计算,它已经接受了它的输入。

另请注意,当您编写有状态函数时(即,当您使用 >>= 绑定(bind)运算符或 do 表示法时)您正是这样做的:您将输入作为表达式提供,而绑定(bind)只负责传递状态。

您可以调用get不使用它的返回值,然后它就会丢失。如果你想使用它,你必须使用 value <- get然后提供value作为下一个有状态计算的显式输入。绑定(bind)仅在传递状态时才起作用。

实际例子:考虑函数:

doStuff :: Int -> State Int Int
doStuff x = do
val <- get
put $ val+x+1
return 0
doStuff type 的模式正好是 input -> state -> (state, output) .但是 input部分由 x 表示争论。
一旦您提供 x你会得到 state -> (state, output) 类型的东西这正是 runState代表。

因此,您实际上并不需要有状态操作的参数,因为您可以预先部分应用它们以获得“没有输入的纯有状态计算”(那些是可怕的引号)。

关于haskell - 为什么 runState 签名只有状态参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36188080/

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