Stateモナド
純粋に状態 (付き計算)を扱うためのモナド
別名:状態変換器(state transformer)
こっちのほうが関数になる理由がわかりやすいかも
IOモナドはRealWordを状態として持つStateモナド code:def_state.hs
newtype State s a = State { runState :: s -> (s, a) }
sが状態,aが値。
ある状態sから更新された状態s'と値への変換
code:state_monad.hs
instance Monad (State s) where
return x = State $ \s -> (x,s)
(State h) >>= f = State $ \s -> let (a, s') = h s
(State g) = f a
in g s'
補足
bindの型は理解しといたほうがいい
code:bind_type.hs
>= :: State s a -> (a -> State s b) -> State s b
>= :: (s -> (s, a)) -> (a -> s -> (s, b)) -> (s -> (s, b))
State hの意味
レコードを使っていても位置を指定してのコンストラクタとしてStateが使える
h :: s -> (s, a)なのでここで受け入れられる
let (a, s') = h sの意味
現在の状態sにhを適応して、新しい状態s'と値aを得る
この状態sに適応して新しいs'を生み出せるということができるのはStateが関数でなくてはいけないポイント