國家 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 儘可能地靠近底部(這樣你的行為就會受到影響。可能。