wvogel日記

自分用の技術備忘録が多めです.

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を使って書いてみたい
何かこういうゲームみたいなのでもいいから、題材ってないかなー