State Monad

*Main> :t runState
runState :: State s a -> s -> (a, s)
*Main> :t (do c<-get; put [1,2,3]; return "hogehoge")
(do c<-get; put [1,2,3]; return "hogehoge") :: (Num a, MonadState [a] m) => m [Char]
*Main> :t runState (do c<-get; put [1,2,3]; return "hogehoge")
runState (do c<-get; put [1,2,3]; return "hogehoge") :: (Num a) => [a] -> ([Char], [a])
*Main> runState (do c<-get; put [1,2,3]; return "hogehoge") []
("hogehoge",[1,2,3])

やっとこさState Monadを自分で記述出来るレベルまで習得した。やっぱ型式だけ見てても駄目ね...。Closureさん頑張ってるなぁ。