国家 Monad
Haskell 的新人常常回避 State
monad 并将其视为一种禁忌 - 就像声称功能编程的好处是避免状态一样,所以当你使用 State
时不要失去它吗?更细微的观点是:
- 状态可用于小剂量控制剂量 ;
State
类型提供了非常精确地控制剂量的能力。
原因是如果你有 action::State s a
,这会告诉你:
action
很特别,因为它取决于一个状态;- 国家有类型
s
,所以action
不能受你的程序中任何旧值的影响 - 只有s
或某些s
可以达到的值; runState::State s a -> s -> (a, s)
围绕有状态的动作设置了障碍,因此无法从障碍物的外部观察到它的有效性。
因此,对于是否在特定场景中使用 State
,这是一套很好的标准。你想看到你的代码正在最小化状态的范围,既可以选择 s
的窄类型,也可以将 runState
尽可能地靠近底部(这样你的行为就会受到影响。可能。