国家 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 尽可能地靠近底部(这样你的行为就会受到影响。可能。