{"id":383312,"date":"2024-06-29T04:50:15","date_gmt":"2024-06-29T04:50:15","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=383312"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=383312","title":{"rendered":"<span>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u043d\u0430\u0434\u0443 State \u043d\u0430 Haskell<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u0414\u043e\u0440\u043e\u0433\u0438\u0435 \u0425\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435! \u042f \u0438\u0437\u0443\u0447\u0430\u044e<code>Haskell<\/code>, \u0438 \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u043e\u043d\u0430\u0434\u0443<code>State<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435! \u042f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438 \u043c\u043e\u0433\u0443 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0440\u0438\u0442\u0438\u043a\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Haskell, \u0438 \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>Haskell<\/code>&#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u0444-\u0438\u0438 \u0447\u0438\u0441\u0442\u044b\u0435. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u0432\u0435\u0441\u044c \u043a\u043e\u0434 &#8212; \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u043a: <\/p>\n<pre><code class=\"haskell\">-- \u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430. -- someFunc (Int, Int) -> Int  -- *\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430. someFunc :: Int -> Int -> Int -- \u0422\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437: someFunc 0 0 = 42 someFunc arg arg' = arg + arg'<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445&#187; \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0448\u0442\u0440\u0438\u0445: <code>arg'<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435&#187; &#8212; \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u0443\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"haskell\">-- \u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0444-\u0438\u0438 (+)  -- \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 (+) :: Num a => a -> a -> a -- \u041f\u0440\u043e => \u0441\u043c. \u0434\u0430\u043b\u0435\u0435.  -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439: (+) 1 3  -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444-\u0438\u0439 \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (\u0432 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435): 4 `div` 2<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0447\u0442\u043e &#8212; \u0442\u043e \u0442\u0438\u043f\u0430<code>(Num a, Integral b, Show q, Eq s, ...) =><\/code> \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 (\u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432), \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, <code>a<\/code>\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 Num, <code>b<\/code>&#8212; \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Integral<\/code>&#8230;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u044d\u0442\u043e \u0447\u0442\u043e &#8212; \u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u043e\u0447\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"haskell\">-- (.) - \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0444-\u0438\u0439: (.) :: (b -> c) -> (a -> b) -> (a -> c) (f . g) x = f (g x)  -- ($) - \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444-\u0438\u0438. \u0418\u043c\u0435\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442, -- \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0430\u0432\u043e\u0430\u0441\u0441\u0430\u0446\u0438\u043e\u0442\u0438\u0432\u0435\u043d. -- (\u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444-\u0438\u0438 - \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439.) ($) :: (a -> b) -> a -> b f $ a = f a  -- (:) - Cons \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442: -- 1:[2, 3] === [1, 2, 3]<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u0412\u044b \u0438 \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e. \u0412\u0441\u0435 \u0444-\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b:<\/p>\n<pre><code class=\"haskell\">f :: Num a => a -> a -> a f a b = a + b  -- \"\u0421\u044a\u0435\u043b\u0438\" \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. g :: Num a => a -> a g' :: Num a => a -> a g x = f 5 x -- \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \"\u0431\u0435\u0441\u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0439 \u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439\": g' = f 5 -- \u0423\u0431\u0440\u0430\u043b\u0438 \"\u0442\u043e\u0447\u043a\u0443\" \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 x \u0441 \u043e\u0431\u043e\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d.<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 <code>Haskell<\/code> \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0442. \u0435. \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445):<\/p>\n<pre><code class=\"haskell\">f :: Num a => a -> a -> a f a b = a + b f = \\a b -> a + b -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u044f\u043c\u0431\u0434\u0443.<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443: \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u041b\u0421.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0414\u0430 \u043a\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u044d\u0442\u0438 \u0432\u0430\u0448\u0438 \u043c\u043e\u043d\u0430\u0434\u044b!?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043e\u043d\u0430\u0434\u044b &#8212; \u044d\u0442\u043e \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 (\u0441\u043c. \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b) \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0432\u043e\u0442 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">class Monad m where -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u041c\u043e\u043d\u0430\u0434\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u0430 m   (>>=)  :: m a -> (  a -> m b) -> m b   -- \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444-\u0438\u044e \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e    (>>)   :: m a ->  m b         -> m b   -- \"\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442\" \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435    return ::   a                 -> m a   -- \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.      x >> y = x >>= \\_ -> y -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/code><\/pre>\n<p> \u0414\u043b\u044f \u041c\u043e\u043d\u0430\u0434 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u0430 <code>do-\u043d\u043e\u0442\u0430\u0446\u0438\u044f<\/code>, &#171;\u0441\u043a\u043b\u0435\u0438\u0432\u0430\u044e\u0449\u0430\u044f&#187; \u0432\u0441\u0451 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>>><\/code><\/p>\n<\/div>\n<\/details>\n<h2>\u041e\u0441\u043d\u043e\u0432\u044b: \u043a\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 State?<\/h2>\n<p>\u041d\u0435\u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0438\u0432\u0438\u0442\u044c\u0441\u044f: \u043a\u0430\u043a \u0442\u0430\u043a, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (!) \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435! \u041e\u0434\u043d\u0430\u043a\u043e, \u0445\u0438\u0442\u0440\u044b\u0435 \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u044b \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 &#171;\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435&#187;. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430,<code>State<\/code>\u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">newtype State s a = State { runState :: s -> (a, s)}<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <code>State Integer ()<\/code>  \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0430\u044f <code>Integer <\/code>\u0432 \u043a\u043e\u0440\u0442\u0435\u0434\u0436 ((), <code>Integer<\/code>). \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e:<code>s<\/code> &#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 <code>a<\/code> &#8212; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. &#171;\u041d\u043e, \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u043d\u0430\u0434\u0430!&#187;, \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u0435 \u0412\u044b, \u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0440\u0430\u0432\u044b, \u0432\u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u0430\u043a \u041c\u043e\u043d\u0430\u0434\u044b:<\/p>\n<pre><code class=\"haskell\">instance Monad (State s) where return x = State $ \\s -> (x, s) (State h) >>= f = State $ \\s ->  let (a, newState) = h s (State g) = f a in g newState      -- x >> y = x >>= \\_ -> y<\/code><\/pre>\n<p><code>return x<\/code>, \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0442. \u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>a<\/code>(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439), \u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0439: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f pattern matching, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (<code>h<\/code>), \u0438 \u0434\u0430\u043b\u0435\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>s<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u044e\u0449\u0430\u044f <code>g newState<\/code>, \u0433\u0434\u0435 <code>newState<\/code> &#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>h s<\/code>, \u0430 <code>g<\/code> &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f &#171;\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u043c&#187; \u0432\u044b\u0437\u043e\u0432\u0430 <code>f a<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0442. \u0435. \u0444\u0443\u043d\u043a\u0446\u0438\u044e) \u043d\u043e\u0432\u044b\u043c, &#171;\u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u044f&#187; \u0441\u043b\u043e\u0438. \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>>><\/code>. <\/p>\n<pre><code class=\"haskell\">import Control.Monad.State  set_state :: s -> State s () set_state s = state $ \\_ -> ((), s)      get_state :: State s s get_state = state $ \\s ->     (s, s)    main' :: State Integer Integer main' = do     set_state 10     state' &lt;- get_state     return state'    -- \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u0442\u043e\u043c\u0443: main'' = set_state 10 >> (get_state >>= \\state' -> return state') -- \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u0442\u043e\u043c\u0443: main''' = set_state 10 >>= \\_ -> get_state >>= \\state' -> return state'<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 state \u0438 State<\/summary>\n<div class=\"spoiler__content\">\n<p><code>State<\/code>&#8212; \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u0430 <code>State<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0444-\u0438\u044f <code>state<\/code>, \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<code>set_ get_ -state<\/code> \u043c\u044b \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432 <code>state<\/code>, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 <code>main'<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f do-\u043d\u043e\u0442\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187; \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c\u044b \u0432\u044b\u0437\u043e\u0432\u044b <code>bind<\/code> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"haskell\">main' = set_state 10 >>= \\_ -> get_state >>= \\state' -> return state'  -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_ \u0438 set_ -state, \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043b\u043e\u043a \u0441 return (\u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e) main2 = state (\\_ -> ((), 10)) >>= \\_ -> state (\\s -> (s, s))  -- \"\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\" \u0432\u044b\u0437\u043e\u0432\u044b >>= \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 main3 = State $ \\s -> let (a, newState) = (\\_ -> ((), 10)) s     (State g) = (\\_ -> state (\\s -> (s, s))) a     in g newState      -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u044f\u043c\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 main4 = State $ \\s -> let (a, newState) = ((), 10)     (State g) = state (\\s -> (s, s))     in g newState      -- \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 pattern matching main5 = State $ \\s -> let a = ()   newState = 10              g = \\s -> (s, s)   in g newState    -- * \u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \"\u0434\u043e\u0441\u0442\u0430\u0442\u044c\" \u0444-\u0438\u044e \u0438\u0437 State, --   \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f runState (\u0441\u043c. \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 State) -- \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 main6 = (\\s -> (s, s)) 10  -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438 \u044d\u0442\u0443 \u043b\u044f\u043c\u0431\u0434\u0443 main7 = (10, 10)<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 &#171;\u0433\u0440\u044f\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443&#187; \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u0430\u043a \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u0435\u0435.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435?<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u043c\u0430\u0433\u0438\u0435\u0439 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0441\u0430\u043c\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0430\u044f \u0435\u0441\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430 \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.<\/p>\n<pre><code class=\"haskell\">import qualified Control.Monad.State as S  newtype Var name val = Var {runVar :: (name, val)} -- \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f - \u043e\u0431\u0451\u0440\u0442\u043a\u0430                                                     -- \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430. type Vars name val = [Var name val]                       -- | type VarState name val res = S.State (Vars name val) res  -- | \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. type VarEnv val = VarState String val (Maybe val)         -- |<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f &#8212; \u043e\u0431\u0451\u0440\u0442\u043a\u0430 <code>Var<\/code>, \u0418 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 <code>Vars<\/code> (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445), <code>VarState<\/code>(\u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0443 <code>State<\/code>) \u0438 <code>VarEnv<\/code>(\u043a\u0430\u043a \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <code>VarState<\/code>, \u043e \u043d\u0451\u043c \u043f\u043e\u043f\u043e\u0437\u0436\u0435). \u0414\u0430\u043b\u0435\u0435 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e<code>Var<\/code>\u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>Show<\/code>\u0438 <code>Eq<\/code>:<\/p>\n<pre><code class=\"haskell\">instance (Show name, Show val) => Show (Var name val) where     show (Var (name, val)) = \"Var \" ++ show name ++ \" = \" ++ show val  instance (Eq name, Eq val) => Eq (Var name val) where         Var (name, val) == Var (name', val') = (name == name') &amp;&amp; (val == val')<\/code><\/pre>\n<p>\u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Show<\/code>&#8212; \u043e\u0431\u044c\u0435\u043a\u0442\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Eq<\/code>&#8212; \u043e\u0431\u044c\u0435\u043a\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c (<code>==<\/code>, <code>\/=<\/code>). \u0414\u0430\u043b\u0435\u0435, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f <code>Var<\/code>:<\/p>\n<pre><code class=\"haskell\">varName :: Var name val -> name varName = fst . runVar  varVal :: Var name val -> val varVal = snd . runVar  var :: name -> val -> Var name val var name val = Var (name, val)  runVars vars = S.runState vars []  -- \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a: -- runVars $ do --     ... -- \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 (\u0441\u043c. \u0434\u0430\u043b\u044c\u0448\u0435)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>var<\/code>\u043d\u0443\u0436\u043d\u0430 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430 \u043a\u0430\u043a <code>Var (name, value)<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0427\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438? \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c (\u0432 \u0442. \u0447. \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"haskell\">-- \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 -- \u0424-\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u043e\u0431\u0451\u0440\u0442\u043a\u0430  -- \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u044c\u0435\u043a\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439: assign :: Eq name => name -> val -> VarState name val () name `assign` val = assignV $ var name val -- \u0424-\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u044c\u0435\u043a\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 -- \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f. assignV :: Eq name => Var name val -> VarState name val ()  assignV var = S.state $     \\vars -> ((), vars `assignV'` var) -- \u0421\u0430\u043c\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. assignV' :: Eq name => Vars name val -> Var name val -> Vars name val assignV' ((cvar@(Var (cname, _))):xs) (var@(Var (name, _)))     | cname == name = var:xs      -- \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c     -- \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439.     | otherwise = cvar:(xs `assignV'` var)     -- \u0418\u043d\u0430\u0447\u0435 \"\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u043e\u043a\u043e\u0435\" \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c.  assignV' [] var = [var] -- \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e.<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"haskell\">-- \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e\u0431 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. -- \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u043c (\u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439), -- \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 -- Maybe val. get :: Eq name => name -> VarState name val (Maybe val) get name = S.state $     \\vars -> (vars `get'` name, vars)  -- \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e. get' :: Eq name => Vars name val -> name -> Maybe val get' ((Var (cname, val)):xs) name     | cname == name = Just val      -- \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e     -- \u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u043e\u0435 \u0432 Just     | otherwise = xs `get'` name     -- \u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c.   get' [] _ = Nothing -- \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c Nothing.<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041d\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u044e, \u0447\u0443\u0442\u044c &#8212; \u0447\u0443\u0442\u044c \u043a\u0440\u0438\u0432\u043e\u0435:<\/p>\n<pre><code class=\"haskell\">-- \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c. del :: Eq name => name -> VarState name val (Maybe ()) del name = S.state $ -- \u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 del'     \\vars -> vars `del'` name  -- \u0424-\u0438\u044f, \u0443\u0434\u0430\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c. -- \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0436\u0435 Maybe (), \u0442. \u043a. \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, -- \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442. del' :: Eq name => Vars name val -> name -> (Maybe (), Vars name val) del' [] _ = (Nothing, []) -- \u041d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0439 \u043d\u0435\u0442. del' (cvar@(Var (cname, _)):xs) name     | cname == name = (Just (), xs)      -- \u0415\u0441\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c     -- \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0431\u0435\u0437 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439) \u0438 Just (), \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u043c,     -- \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e.     | otherwise = (res, cvar:vars) where (res, vars) = xs `del'` name     -- \u0418\u043d\u0430\u0447\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e      -- \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435.<\/code><\/pre>\n<p>\u041e\u0445, \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u0438\u0435 \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"haskell\">import qualified Vars as V  main :: IO () main = print . runVar $ vars_stuff  vars_stuff :: V.VarEnv Integer vars_stuff = do     init_vars     b &lt;- V.get \"VarB\"      V.del \"VarB\"      return b  init_vars :: V.VarState String Integer () init_vars = do     \"VarA\" `V.assign` 10     \"VarB\" `V.assign` 42     \"VarC\" `V.assign` 33      -- \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: (Just 42, [Var \"VarA\" = 10,Var \"VarC\" = 33])<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u044f \u043e\u0431\u0435\u0449\u0430\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0437\u0434\u0435\u0441\u044c <code>VarEnv val<\/code>. \u0422. \u043a. \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u043c\u044f &#8212; \u0441\u0442\u0440\u043e\u043a\u0430, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212;<code>Maybe<\/code>\u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0442\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u044d\u0442\u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0442\u0438\u043f\u0430.  <\/p>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e! \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c, \u041c\u043e\u0438\u043c \u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435, \u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0412\u0430\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 (\u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"haskell\">module Vars (     VarState,     VarEnv,      assign,     get,     del,      var,     varName,     varVal,      runVars ) where  import qualified Control.Monad.State as S  newtype Var name val = Var {runVar :: (name, val)}  type Vars name val = [Var name val] type VarState name val res = S.State (Vars name val) res type VarEnv val = VarState String val (Maybe val)  instance (Show name, Show val) =>          Show (Var name val) where     show (Var (name, val)) =          \"Var \" ++ show name ++ \" = \" ++ show val  instance (Eq name, Eq val) =>          Eq (Var name val) where         Var (name, val) == Var (name', val') =             (name == name') &amp;&amp; (val == val')  varName :: Var name val -> name varName = fst . runVar  varVal :: Var name val -> val varVal = snd . runVar  var :: name -> val -> Var name val var name val = Var (name, val)  assign :: Eq name => name -> val -> VarState name val () name `assign` val = assignV $ var name val  assignV :: Eq name => Var name val -> VarState name val ()  assignV var = S.state $     \\vars -> ((), vars `assignV'` var)  assignV' :: Eq name => Vars name val -> Var name val -> Vars name val assignV' ((cvar@(Var (cname, _))):xs) (var@(Var (name, val)))     | cname == name = (var):xs     | otherwise = cvar:(xs `assignV'` var)  assignV' [] var = [var]  get :: Eq name => name -> VarState name val (Maybe val) get name = S.state $     \\vars -> (vars `get'` name, vars)  get' :: Eq name => Vars name val -> name -> Maybe val get' ((Var (cname, val)):xs) name     | cname == name = Just val     | otherwise = xs `get'` name  get' [] _ = Nothing  del :: Eq name => name -> VarState name val (Maybe ()) del name = S.state $     \\vars -> vars `del'` name  del' :: Eq name => Vars name val -> name -> (Maybe (), Vars name val) del' [] _ = (Nothing, []) del' (cvar@(Var (cname, _)):xs) name     | cname == name = (Just (), xs)     | otherwise = (res, cvar:vars) where (res, vars) = xs `del'` name  runVars vars = S.runState vars [] <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/595567\/\"> https:\/\/habr.com\/ru\/articles\/595567\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u0414\u043e\u0440\u043e\u0433\u0438\u0435 \u0425\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435! \u042f \u0438\u0437\u0443\u0447\u0430\u044e<code>Haskell<\/code>, \u0438 \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u043e\u043d\u0430\u0434\u0443<code>State<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435! \u042f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438 \u043c\u043e\u0433\u0443 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0440\u0438\u0442\u0438\u043a\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Haskell, \u0438 \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>Haskell<\/code>&#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u0444-\u0438\u0438 \u0447\u0438\u0441\u0442\u044b\u0435. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u0432\u0435\u0441\u044c \u043a\u043e\u0434 &#8212; \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u043a: <\/p>\n<pre><code class=\"haskell\">-- \u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430. -- someFunc (Int, Int) -> Int  -- *\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430. someFunc :: Int -> Int -> Int -- \u0422\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437: someFunc 0 0 = 42 someFunc arg arg' = arg + arg'<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445&#187; \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0448\u0442\u0440\u0438\u0445: <code>arg'<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435&#187; &#8212; \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u0443\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"haskell\">-- \u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0444-\u0438\u0438 (+)  -- \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 (+) :: Num a => a -> a -> a -- \u041f\u0440\u043e => \u0441\u043c. \u0434\u0430\u043b\u0435\u0435.  -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439: (+) 1 3  -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444-\u0438\u0439 \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (\u0432 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435): 4 `div` 2<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0447\u0442\u043e &#8212; \u0442\u043e \u0442\u0438\u043f\u0430<code>(Num a, Integral b, Show q, Eq s, ...) =><\/code> \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 (\u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432), \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, <code>a<\/code>\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 Num, <code>b<\/code>&#8212; \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Integral<\/code>&#8230;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u044d\u0442\u043e \u0447\u0442\u043e &#8212; \u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u043e\u0447\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"haskell\">-- (.) - \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0444-\u0438\u0439: (.) :: (b -> c) -> (a -> b) -> (a -> c) (f . g) x = f (g x)  -- ($) - \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444-\u0438\u0438. \u0418\u043c\u0435\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442, -- \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0430\u0432\u043e\u0430\u0441\u0441\u0430\u0446\u0438\u043e\u0442\u0438\u0432\u0435\u043d. -- (\u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444-\u0438\u0438 - \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439.) ($) :: (a -> b) -> a -> b f $ a = f a  -- (:) - Cons \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442: -- 1:[2, 3] === [1, 2, 3]<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u0412\u044b \u0438 \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e. \u0412\u0441\u0435 \u0444-\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b:<\/p>\n<pre><code class=\"haskell\">f :: Num a => a -> a -> a f a b = a + b  -- \"\u0421\u044a\u0435\u043b\u0438\" \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. g :: Num a => a -> a g' :: Num a => a -> a g x = f 5 x -- \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \"\u0431\u0435\u0441\u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0439 \u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439\": g' = f 5 -- \u0423\u0431\u0440\u0430\u043b\u0438 \"\u0442\u043e\u0447\u043a\u0443\" \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 x \u0441 \u043e\u0431\u043e\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d.<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 <code>Haskell<\/code> \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0442. \u0435. \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445):<\/p>\n<pre><code class=\"haskell\">f :: Num a => a -> a -> a f a b = a + b f = \\a b -> a + b -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u044f\u043c\u0431\u0434\u0443.<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443: \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u041b\u0421.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0414\u0430 \u043a\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u044d\u0442\u0438 \u0432\u0430\u0448\u0438 \u043c\u043e\u043d\u0430\u0434\u044b!?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043e\u043d\u0430\u0434\u044b &#8212; \u044d\u0442\u043e \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 (\u0441\u043c. \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b) \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0432\u043e\u0442 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">class Monad m where -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u041c\u043e\u043d\u0430\u0434\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u0430 m   (>>=)  :: m a -> (  a -> m b) -> m b   -- \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444-\u0438\u044e \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e    (>>)   :: m a ->  m b         -> m b   -- \"\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442\" \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435    return ::   a                 -> m a   -- \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.      x >> y = x >>= \\_ -> y -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/code><\/pre>\n<p> \u0414\u043b\u044f \u041c\u043e\u043d\u0430\u0434 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u0430 <code>do-\u043d\u043e\u0442\u0430\u0446\u0438\u044f<\/code>, &#171;\u0441\u043a\u043b\u0435\u0438\u0432\u0430\u044e\u0449\u0430\u044f&#187; \u0432\u0441\u0451 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>>><\/code><\/p>\n<\/div>\n<\/details>\n<h2>\u041e\u0441\u043d\u043e\u0432\u044b: \u043a\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 State?<\/h2>\n<p>\u041d\u0435\u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0438\u0432\u0438\u0442\u044c\u0441\u044f: \u043a\u0430\u043a \u0442\u0430\u043a, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (!) \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435! \u041e\u0434\u043d\u0430\u043a\u043e, \u0445\u0438\u0442\u0440\u044b\u0435 \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u044b \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 &#171;\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435&#187;. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430,<code>State<\/code>\u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">newtype State s a = State { runState :: s -> (a, s)}<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <code>State Integer ()<\/code>  \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0430\u044f <code>Integer <\/code>\u0432 \u043a\u043e\u0440\u0442\u0435\u0434\u0436 ((), <code>Integer<\/code>). \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e:<code>s<\/code> &#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 <code>a<\/code> &#8212; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. &#171;\u041d\u043e, \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u043d\u0430\u0434\u0430!&#187;, \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u0435 \u0412\u044b, \u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0440\u0430\u0432\u044b, \u0432\u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u0430\u043a \u041c\u043e\u043d\u0430\u0434\u044b:<\/p>\n<pre><code class=\"haskell\">instance Monad (State s) where return x = State $ \\s -> (x, s) (State h) >>= f = State $ \\s ->  let (a, newState) = h s (State g) = f a in g newState      -- x >> y = x >>= \\_ -> y<\/code><\/pre>\n<p><code>return x<\/code>, \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0442. \u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>a<\/code>(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439), \u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0439: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f pattern matching, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (<code>h<\/code>), \u0438 \u0434\u0430\u043b\u0435\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>s<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u044e\u0449\u0430\u044f <code>g newState<\/code>, \u0433\u0434\u0435 <code>newState<\/code> &#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>h s<\/code>, \u0430 <code>g<\/code> &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f &#171;\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u043c&#187; \u0432\u044b\u0437\u043e\u0432\u0430 <code>f a<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0442. \u0435. \u0444\u0443\u043d\u043a\u0446\u0438\u044e) \u043d\u043e\u0432\u044b\u043c, &#171;\u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u044f&#187; \u0441\u043b\u043e\u0438. \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>>><\/code>. <\/p>\n<pre><code class=\"haskell\">import Control.Monad.State  set_state :: s -> State s () set_state s = state $ \\_ -> ((), s)      get_state :: State s s get_state = state $ \\s ->     (s, s)    main' :: State Integer Integer main' = do     set_state 10     state' &lt;- get_state     return state'    -- \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u0442\u043e\u043c\u0443: main'' = set_state 10 >> (get_state >>= \\state' -> return state') -- \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u0442\u043e\u043c\u0443: main''' = set_state 10 >>= \\_ -> get_state >>= \\state' -> return state'<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 state \u0438 State<\/summary>\n<div class=\"spoiler__content\">\n<p><code>State<\/code>&#8212; \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u0430 <code>State<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0444-\u0438\u044f <code>state<\/code>, \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<code>set_ get_ -state<\/code> \u043c\u044b \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432 <code>state<\/code>, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 <code>main'<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f do-\u043d\u043e\u0442\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187; \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c\u044b \u0432\u044b\u0437\u043e\u0432\u044b <code>bind<\/code> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"haskell\">main' = set_state 10 >>= \\_ -> get_state >>= \\state' -> return state'  -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_ \u0438 set_ -state, \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043b\u043e\u043a \u0441 return (\u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e) main2 = state (\\_ -> ((), 10)) >>= \\_ -> state (\\s -> (s, s))  -- \"\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\" \u0432\u044b\u0437\u043e\u0432\u044b >>= \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 main3 = State $ \\s -> let (a, newState) = (\\_ -> ((), 10)) s     (State g) = (\\_ -> state (\\s -> (s, s))) a     in g newState      -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u044f\u043c\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 main4 = State $ \\s -> let (a, newState) = ((), 10)     (State g) = state (\\s -> (s, s))     in g newState      -- \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 pattern matching main5 = State $ \\s -> let a = ()   newState = 10              g = \\s -> (s, s)   in g newState    -- * \u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \"\u0434\u043e\u0441\u0442\u0430\u0442\u044c\" \u0444-\u0438\u044e \u0438\u0437 State, --   \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f runState (\u0441\u043c. \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 State) -- \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 main6 = (\\s -> (s, s)) 10  -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438 \u044d\u0442\u0443 \u043b\u044f\u043c\u0431\u0434\u0443 main7 = (10, 10)<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 &#171;\u0433\u0440\u044f\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443&#187; \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u0430\u043a \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u0435\u0435.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435?<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u043c\u0430\u0433\u0438\u0435\u0439 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0441\u0430\u043c\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0430\u044f \u0435\u0441\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430 \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.<\/p>\n<pre><code class=\"haskell\">import qualified Control.Monad.State as S  newtype Var name val = Var {runVar :: (name, val)} -- \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f - \u043e\u0431\u0451\u0440\u0442\u043a\u0430                                                     -- \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430. type Vars name val = [Var name val]                       -- | type VarState name val res = S.State (Vars name val) res  -- | \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. type VarEnv val = VarState String val (Maybe val)         -- |<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f &#8212; \u043e\u0431\u0451\u0440\u0442\u043a\u0430 <code>Var<\/code>, \u0418 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 <code>Vars<\/code> (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445), <code>VarState<\/code>(\u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0443 <code>State<\/code>) \u0438 <code>VarEnv<\/code>(\u043a\u0430\u043a \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <code>VarState<\/code>, \u043e \u043d\u0451\u043c \u043f\u043e\u043f\u043e\u0437\u0436\u0435). \u0414\u0430\u043b\u0435\u0435 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e<code>Var<\/code>\u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>Show<\/code>\u0438 <code>Eq<\/code>:<\/p>\n<pre><code class=\"haskell\">instance (Show name, Show val) => Show (Var name val) where     show (Var (name, val)) = \"Var \" ++ show name ++ \" = \" ++ show val  instance (Eq name, Eq val) => Eq (Var name val) where         Var (name, val) == Var (name', val') = (name == name') &amp;&amp; (val == val')<\/code><\/pre>\n<p>\u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Show<\/code>&#8212; \u043e\u0431\u044c\u0435\u043a\u0442\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0422\u0430\u0439\u043f\u043a\u043b\u0430\u0441\u0441 <code>Eq<\/code>&#8212; \u043e\u0431\u044c\u0435\u043a\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c (<code>==<\/code>, <code>\/=<\/code>). \u0414\u0430\u043b\u0435\u0435, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f <code>Var<\/code>:<\/p>\n<pre><code class=\"haskell\">varName :: Var name val -> name varName = fst . runVar  varVal :: Var name val -> val varVal = snd . runVar  var :: name -> val -> Var name val var name val = Var (name, val)  runVars vars = S.runState vars []  -- \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a: -- runVars $ do --     ... -- \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 (\u0441\u043c. \u0434\u0430\u043b\u044c\u0448\u0435)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>var<\/code>\u043d\u0443\u0436\u043d\u0430 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u043a\u043e\u0440\u0442\u0435\u0434\u0436\u0430 \u043a\u0430\u043a <code>Var (name, value)<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0427\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438? \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c (\u0432 \u0442. \u0447. \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"haskell\">-- \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 -- \u0424-\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u043e\u0431\u0451\u0440\u0442\u043a\u0430  -- \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u044c\u0435\u043a\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439: assign :: Eq name => name -> val -> VarState name val () name `assign` val = assignV $ var name val -- \u0424-\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u044c\u0435\u043a\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 -- \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f. assignV :: Eq name => Var name val -> VarState name val ()  assignV var = S.state $     \\vars -> ((), vars `assignV'` var) -- \u0421\u0430\u043c\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. assignV' :: Eq name => Vars name val -> Var name val -> Vars name val assignV' ((cvar@(Var (cname, _))):xs) (var@(Var (name, _)))     | cname == name = var:xs      -- \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c     -- \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439.     | otherwise = cvar:(xs `assignV'` var)     -- \u0418\u043d\u0430\u0447\u0435 \"\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u043e\u043a\u043e\u0435\" \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c.  assignV' [] var = [var] -- \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e.<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"haskell\">-- \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e\u0431 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. -- \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u043c (\u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439), -- \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 -- Maybe val. get :: Eq name => name -> VarState name val (Maybe val) get name = S.state $     \\vars -> (vars `get'` name, vars)  -- \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e. get'<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-383312","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=383312"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383312\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=383312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=383312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=383312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}