State s a is the designation of the function --- "state transformer function"
s -> (a, s)
, s , , a. " ". , , - .
upd :: Int -> (Int, Int)
upd s = let s' = s + 1 in (s', s')
a s .
, , , . - upd.
, " ". :
compose :: (s -> (a, s)) -- the initial state transformer
-> (a -> (s -> (b, s))) -- a new state transformer, built using the "result"
-- of the previous one
-> (s -> (b, s)) -- the result state transformer
, , , . :
compose f f' = \s -> let (a, s') = f s
(b, s'') = f' a s'
in (b, s'')
, s -typed, [s, s', s''] " ", , , .
compose , , upd
twoUnique :: Int -> ((Int, Int), Int)
twoUnique = compose upd (\a s -> let (a', s') = upd s in ((a, a'), s'))
State. , , compose , .
(>>=) :: State s a -> (a -> State s b ) -> State s b
(>>=) :: (s -> (a, s)) -> (a -> (s -> (b, s)) -> (s -> (b, s))
. "" "" State --- State runState
State :: (s -> (a, s)) -> State s a
runState :: State s a -> (s -> (a, s))
compose (>>=)
compose f f' = \s -> let (a, s') = f s
(b, s'') = f' a s'
in (b, s'')
(>>=) (State f) f' = State $ \s -> let (a, s') = f s
(b, s'') = runState (f' a) s'
in (b, s'')