Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad.Trans.State.Lazy
- import Control.Monad
- --1
- -- execState :: State s a -> s -> s
- -- s - начальное (иниц-ое) состояние
- -- s(второе) - результирующее состояние
- --
- -- --2
- -- evalState :: State s a
- -- -> s -> a -- возвращает значение
- -- evalState m s = fst (runState m s)
- --
- -- --3
- -- get :: StateT s s
- -- get = State $\st -> (st, st)
- --
- -- *Main> runState get 5
- -- (5,5)
- --
- -- --4
- -- put :: s -> StateT s () -- как tell (reader)
- -- put st = State $\_ -> ((), st)
- --
- -- > runState (put 7) 5
- -- ((),7)
- --Пример (совместимое использование put и get)
- tick :: State Int Int -- увеличивает состояние на 1, возвращает предыдущее значение состояния
- tick = do
- n <- get --обращаемся к текущему состоянию
- put (n + 1) --увеличиваем состояние на 1
- return n
- tick2 :: State Int Int -- увеличивает состояние на 1, возвращает предыдущее значение состояния
- tick2 = do
- n <- get --обращаемся к текущему состоянию
- put (n + 1) --увеличиваем состояние на 1
- return n
- --5
- --modify :: (s -> s) -> StateT s () -- эта ф-я изменяет состояние с помощью ф-ии (s -> s) = f
- --modify f = State $\s -> ((), f s)
- -- > runState (modify (^2)) 5
- -- ((),25)
- --Пример replicateM = sequence.replicate n -- для n-кратного повторения монадических вычислений
- succ' n = execState tick n
- plus n x = execState (sequence $ replicate n tick) x
- -- > plus 2 5
- -- 7
- -- >:t sequence
- -- sequence :: t (m a) -> m (t a)
- -- > sequence[Just 1, Just 2]
- -- Just [1,2]
- -- > sequence $ sequence[Just 1, Just 2]
- -- [Just 1,Just 2]
- -- > sequence[Just 1, Nothing]
- -- Nothing
- -- > :t sequence_
- -- sequence_ :: (Monad m, Foldable t) => t (m a) -> m ()
- -- > sequence_ [Just 1, Just 2]
- -- Just ()
- -- > execState (sequence $ replicate 4 tick) 5
- -- 9
- -- > runState (sequence $ replicate 4 tick) 5
- -- ([5,6,7,8],9)
- -- > runState (sequence_ $ replicate 4 tick) 5
- -- ((),9)
- --6
- -- replicateM = sequence.replicate n -- для n-кратного повторения монадических вычислений
- plus' :: Int -> Int -> Int
- plus' n x = execState (replicateM n tick) x
- -- > 4 `plus'` 5
- -- 9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement