Advertisement
Arina0904

Практика 14.12.22

Dec 14th, 2022 (edited)
1,272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Monad.Trans.State.Lazy
  2. import Control.Monad
  3. --1
  4. -- execState :: State s a -> s -> s
  5. -- s - начальное (иниц-ое) состояние
  6. -- s(второе) - результирующее состояние
  7. --
  8. --  --2
  9. -- evalState :: State s a
  10. --  -> s -> a  -- возвращает значение
  11. -- evalState m s = fst (runState m s)
  12. --
  13. -- --3
  14. -- get :: StateT s s
  15. -- get = State $\st -> (st, st)
  16. --
  17. -- *Main> runState get 5
  18. -- (5,5)
  19. --
  20. -- --4
  21. -- put :: s -> StateT s () -- как tell (reader)
  22. -- put st = State $\_ -> ((), st)
  23. --
  24. --  > runState (put 7) 5                                                                                                                                  
  25. -- ((),7)
  26.  
  27. --Пример (совместимое использование put и get)
  28.  
  29. tick :: State Int Int -- увеличивает состояние на 1, возвращает предыдущее значение состояния
  30. tick = do
  31.     n <- get --обращаемся к текущему состоянию
  32.     put (n + 1) --увеличиваем состояние на 1
  33.     return n
  34.  
  35. tick2 :: State Int Int -- увеличивает состояние на 1, возвращает предыдущее значение состояния
  36. tick2 = do
  37.     n <- get --обращаемся к текущему состоянию
  38.     put (n + 1) --увеличиваем состояние на 1
  39.     return n
  40.  
  41. --5
  42.  
  43. --modify :: (s -> s) -> StateT s () -- эта ф-я изменяет состояние с помощью ф-ии (s -> s) = f
  44. --modify f = State $\s -> ((), f s)
  45. -- > runState (modify (^2)) 5
  46. -- ((),25)
  47.  
  48.    
  49. --Пример  replicateM = sequence.replicate n -- для n-кратного повторения монадических вычислений
  50.  
  51. succ' n = execState tick n
  52. plus n x = execState (sequence $ replicate n tick) x
  53. -- > plus 2 5
  54. -- 7
  55.  
  56. -- >:t sequence
  57. -- sequence :: t (m a) -> m (t a)
  58.  
  59. -- > sequence[Just 1, Just 2]
  60. -- Just [1,2]
  61. -- > sequence $ sequence[Just 1, Just 2]
  62. -- [Just 1,Just 2]
  63. -- > sequence[Just 1, Nothing]        
  64. -- Nothing
  65.  
  66. -- > :t sequence_
  67. -- sequence_ :: (Monad m, Foldable t) => t (m a) -> m ()
  68.  
  69. -- > sequence_ [Just 1, Just 2]
  70. -- Just ()
  71.    
  72. -- > execState (sequence $ replicate 4 tick) 5
  73. -- 9
  74. -- > runState (sequence $ replicate 4 tick) 5
  75. -- ([5,6,7,8],9)
  76.    
  77. -- > runState (sequence_ $ replicate 4 tick) 5
  78. -- ((),9)
  79.    
  80.    
  81. --6
  82.  
  83. -- replicateM = sequence.replicate n -- для n-кратного повторения монадических вычислений
  84. plus' :: Int -> Int -> Int
  85. plus' n x = execState (replicateM n tick) x
  86.  
  87. -- > 4 `plus'` 5
  88. -- 9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement