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