State(2)
Haskellwikiにあるサンプルプログラムを動かして、読んでみた。
なるほど、内容は簡単に理解できた。
import Control.Monad.State type GameValue = Int type GameState = (Bool, Int) playGame :: String -> State GameState GameValue playGame [] = do (_, score) <- get return score playGame (x:xs) = do (on, score) <- get 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 startState = (False, 0) main = print $ evalState (playGame "abcaaacbbcabbab") startState
なるほど
文字列先頭からの演算結果が順繰りに渡されると。
evalState関数だけで、その演算つなぎ(>>=)を行い、その第一項を取り出してくれる
runStateはタプルがまるごと返ってくるから、fstと併用すれば同じ結果が得られるのか
利点としては、State s aを返す関数内で状態を覆い隠した状態で処理を行えることですね。get,putという簡単な関数で状態を取得、遷移できてしまう。
これはおもしろいなー
しかし、同様な処理はStateモナドを使わないでも書けてしまう。
今まで書いてみ\きた、木のプログラムとかも、言ってみたら、書き換えた後の木全体を返り値として返してるから。
うーん。
使い分けがいまいちわからん。
というわけで。
何かStateを使って書いてみたい
何かこういうゲームみたいなのでもいいから、題材ってないかなー