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