State elements `put` and` get`

I look at State Monad put and get:

ghci> :t get
get :: MonadState s m => m s

ghci> :t runState
runState :: State s a -> s -> (a, s)

ghci> runState get [1,2,3]
([1,2,3],[1,2,3])

In gettype signature: MonadState s m => m show [1,2,3]does type have MonadState s m? I do not understand what types sand m.

Also, can you say more about how to use put?

ghci>: t put put :: MonadState sm => s → m ()

In general, it seems I do not understand what it is MonadState s m. Could you explain the examples putand get?

+4
source share
2 answers

MonadState s mis a typeclass type restriction, not a type. Signature:

get :: MonadState s m => m s

, m, s, get - m, s. , State transformers:

get :: State s s
put :: s -> State s ()

, State . execState runState, . get :

> execState get 0
0

, put:

> execState (put 1) 0
1

:

> execState (do put 1; put 2) 0
2

:

> execState (do x <- get; put (x + 1)) 0
1

get put , , modify:

> execState (do modify (+ 1)) 0
1

> execState (do modify (+ 2); modify (* 5)) 0
10

MonadState - , . State - :

instance MonadState s (State s) where
  get = Control.Monad.Trans.State.get
  put = Control.Monad.Trans.State.put

, StateT ( , ) . , , lift . , transformers.


State Data.Map:

import Control.Monad.Trans.State
import qualified Data.Map as M

action = do
  modify (M.insert "x" 2)        -- x = 2
  modify (M.insert "y" 3)        -- y = 3
  x <- gets (M.! "x")
  y <- gets (M.! "y")
  modify (M.insert "z" (x + y))  -- z = x + y
  modify (M.adjust (+ 2) "z")    -- z += 2
  gets (M.! "z")                 -- return z

main = do
  let (result, vars) = execState action M.empty

  putStr "Result: "
  print result

  putStr "Vars: "
  print vars
+8

type: MonadState s m = > m s, [1,2,3] MonadState s m? , s .

ghci> runState get [1,2,3]

runState : - State , - . , [1,2,3], (*), s [Integer].

(*) , [1,2,3] :: Num a => [a] , GHCi , [Integer] GHCi.

, , runState

runState :: State [Integer] a -> [Integer] -> (a, [Integer])

:

get :: MonadState s m => m s

m s = State s a, runState, . :

runState :: State [Integer] a -> [Integer] -> (a, [Integer])
get :: MonadState s m => m s
with m s = State [Integer] a

:

runState :: State [Integer] a -> [Integer] -> (a, [Integer])
get :: MonadState s m => m s
with m = State [Integer]
and  s = a

s:

runState :: State [Integer] a -> [Integer] -> (a, [Integer])
get :: MonadState a m => m a
with m = State [Integer]

m:

runState :: State [Integer] a -> [Integer] -> (a, [Integer])
get :: MonadState a (State [Integer]) => State [Integer] a

MonadState a (State [Integer]) , a = [Integer]. , MonasState , , . , State StateT. , :

runState :: State [Integer] a -> [Integer] -> (a, [Integer])
get :: MonadState a (State [Integer]) => State [Integer] a
with a = [Integer]

,

runState :: State [Integer] [Integer] -> [Integer] -> ([Integer], [Integer])
get :: MonadState [Integer] (State [Integer]) => State [Integer] [Integer]

:

runState :: State [Integer] [Integer] -> [Integer] -> ([Integer], [Integer])
get :: State [Integer] [Integer]

.

+1

All Articles