, s -> (a, s). , , "" , s ( , a).
f :: a -> State s b
g :: b -> State s c
>=>
f >=> g
>>=
\a -> f a >>= g
a -> State s c
, - - s, a, c. , a, c s. , . ( ) , , . , , >>= hackage), , , ).
m >>= k = StateT $ \ s -> do
~(a, s') <- runStateT m s
runStateT (k a) s'
StateT runStateT, m s -> (a, s), k a -> (s -> (b, s)), s -> (b, s). , s, b k, a, a? m s, s' m, (k a) ( s -> (b, s)). s m, s' k, s''.
, , , - . , , , State -actions, do -notation bind (>>=) /.
>>= >> , , .
a >> b
a >>= \_ -> b
a, ( ) ( ) b.
tick :: State Int Int
tick = get >>= \n ->
put (n+1) >>
return n
do -notation
tick = do
n <- get
put (n + 1)
return n
, , , .
get current (get :: s -> (s, s) ), <- , , , ( get).
put :: s -> (s -> ((), s)), put :: s -> s -> ((), s), , ( ) , (), ( <- , >> >>=). - put n + 1 .
return , .
, tick s, s+1 s .
, >> , (), put. .