在Haskell中狀態是monad被傳遞來提取和存儲狀態。並且在下面的兩個例子中,兩個都通過使用>>
的狀態monad,並且通過函數內聯和縮減來驗證狀態確實傳遞到下一步。混淆了狀態monad在Haskell中的傳遞
然而這似乎不是很直觀。那麼這是否意味着當我想通過狀態單元時,我只需要>>
(或>>=
和lambda表達式\s -> a
,其中s
在a
中不是免費的)?任何人都可以爲這個事實提供一個直觀的解釋,而不用擔心減少這個功能嗎?
-- the first example
tick :: State Int Int
tick = get >>= \n ->
put (n+1) >>
return n
-- the second example
type GameValue = Int
type GameState = (Bool, Int)
playGame' :: String -> State GameState GameValue
playGame' [] = get >>= \(on, score) -> return score
playGame' (x: xs) = get >>= \(on, score) ->
case x of
'a' | on -> put (on, score+1)
'b' | on -> put (on, score-1)
'c' -> put (not on, score)
_ -> put (on, score)
>> playGame xs
非常感謝!
謝謝!在閱讀之後,我意識到我只是不明白它的價值被丟棄了,但這個狀態仍然傳播開來。 –
很樂意提供幫助,如果答案是您的滿意,請考慮接受它來解決問題(這適用於所有關於計算器的問題),它有助於跟蹤未解決的問題,並幫助其他人在問自己的問題之前找到答案。 – jakubdaniel
感謝您的提示,太LOL –