{"id":330507,"date":"2022-03-10T21:00:37","date_gmt":"2022-03-10T21:00:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=330507"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=330507","title":{"rendered":"<span>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3e1\/2d8\/fa4\/3e12d8fa43c50941c3008cfbd4c57a4c.jpg\" width=\"1064\" height=\"600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3e1\/2d8\/fa4\/3e12d8fa43c50941c3008cfbd4c57a4c.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u044f \u043e\u0449\u0443\u0449\u0430\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0435\u044f\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u043c\u0438, \u0430 \u043f\u0440\u043e \u0447\u0442\u043e-\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435, \u0434\u0440\u0443\u0433\u043e\u0435. \u041f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434 \u043d\u043e\u0441\u043e\u043c, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c. \u041d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u0434\u0435\u043d\u044c &#8212; \u043f\u0440\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0433\u043b\u0443. \u041d\u043e \u043d\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f.<\/p>\n<hr\/>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0412\u0423\u0417\u043e\u0432 \u0438 \u043f\u043e\u0441\u0435\u0449\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c &#171;\u0437\u0430\u0447\u0435\u043c&#187;. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d, \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442, \u0431\u044b\u043b\u0430 \u0430\u043b\u0433\u0435\u0431\u0440\u0430. \u041d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435 \u0442\u0430 \u043a\u043d\u0438\u0436\u043a\u0430 \u041c\u043e\u0440\u0434\u043a\u043e\u0432\u0438\u0447\u0430, \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u043a\u0443\u0447\u043d\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043f\u0440\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u044b \u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043e\u0431\u044a\u0451\u043c\u043d\u0430\u044f \u043d\u0430\u0443\u043a\u0430 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u043f\u043e\u0440\u043e\u0433\u043e\u043c \u0432\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0432\u043e\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u043d\u0430\u0443\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0418 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0438 \u0438\u0437 \u0447\u0435\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0438\u0445, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u043c\u044b \u0435\u0434\u0432\u0430 \u043a\u043e\u0441\u043d\u0451\u043c\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b. \u0417\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0430\u043a\u0441\u0438\u043e\u043c\u0430\u0442\u0438\u043a\u0443 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0434\u0443\u0442 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0417\u0434\u0435\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043e\u0440\u0435\u043c \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"X\" alt=\"X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/485\/693\/07b\/48569307bb06607b9d690823fbfe39c1.svg\"\/>&#8212; \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0421 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b. \u041a\u0430\u043a \u0438 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u044f\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\circ : X \\times X \\to X\" alt=\"\\circ : X \\times X \\to X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e3\/8a4\/385\/2e38a43856cc867a878012949a8cc12c.svg\"\/>\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0422\u043e \u0435\u0441\u0442\u044c, \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 &#8212; \u044d\u0442\u043e \u043f\u0430\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"(X, \\circ)\" alt=\"(X, \\circ)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef4\/9ec\/f29\/ef49ecf29d9900385e6d9937b037a5c0.svg\"\/>\u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c <img decoding=\"async\" class=\"formula inline\" source=\"(\\mathbb{Z} , +)\" alt=\"(\\mathbb{Z} , +)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/723\/e3e\/cd2\/723e3ecd2241b2c9824a7ad91ddc1d87.svg\"\/>.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0441\u043e\u043a \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442 \u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0431\u043e\u0440\u0443 \u0430\u043a\u0441\u0438\u043e\u043c. \u041f\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0432\u044b\u043c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0411\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\circ\" alt=\"\\circ\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/318\/4b9\/8f5\/3184b98f501b0ac691acaa2feb73902a.svg\"\/>\u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"X\" alt=\"X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a6\/ce8\/f03\/9a6ce8f035db4c2f4d04f85889dc5abc.svg\"\/>\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"(a \\circ b) \\circ c = a \\circ (b \\circ c)\" alt=\"(a \\circ b) \\circ c = a \\circ (b \\circ c)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/542\/747\/227\/542747227a1fbe8a7aeef05139002d79.svg\" width=\"185\" height=\"22\"\/><\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0430\u043a\u0441\u0438\u043e\u043c\u044b <img decoding=\"async\" class=\"formula inline\" source=\"(X, \\circ)\" alt=\"(X, \\circ)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0a7\/5e6\/bdc\/0a75e6bdc201e4eb0a8542763307cd60.svg\"\/>\u0443\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u043e\u0439. \u0427\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b? \u0415\u0441\u043b\u0438 \u0432\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043c\u044b\u0441\u043b \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 &#171;\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c&#187; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438.<\/p>\n<p> \u042d\u043b\u0435\u043c\u0435\u043d\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"e \\in X\" alt=\"e \\in X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/79a\/8d4\/84d\/79a8d484d00026ed17f468ebd35af831.svg\"\/>\u00a0\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\exists ! \\; e \\in X : \\forall x \\in X \\; e \\circ x = x \\circ e = x\" alt=\"\\exists ! \\; e \\in X : \\forall x \\in X \\; e \\circ x = x \\circ e = x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c12\/8eb\/7a8\/c128eb7a83659b6dfb4ceade1d6fc5e3.svg\" width=\"297\" height=\"18\"\/><\/p>\n<p>\u041d\u0430\u0448\u0430 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"(X, \\circ)\" alt=\"(X, \\circ)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/985\/e40\/68d\/985e4068d2b7dca5bccf7521ebbca92c.svg\"\/>\u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"e\" alt=\"e\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a9e\/54f\/d9d\/a9e54fd9dec4317390b0480be7a270dc.svg\"\/>\u00a0&#8212; \u0443\u0436\u0435 \u043c\u043e\u043d\u043e\u0438\u0434. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u0430\u043a\u0441\u0438\u043e\u043c\u0435 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0432\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430: \u0431\u044b\u0432\u0430\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u043f\u0440\u0430\u0432\u0430 \u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u043b\u0435\u0432\u0430, \u043d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043c\u043e\u043d\u043e\u0438\u0434\u044b? \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 &#8212; <img decoding=\"async\" class=\"formula inline\" source=\"(\\mathbb{Z}, +,0), (\\mathbb{Z}, *,1)\" alt=\"(\\mathbb{Z}, +,0), (\\mathbb{Z}, *,1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b21\/84d\/85c\/b2184d85cd5a8380450e1831fd74841d.svg\"\/>. \u041d\u043e \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451 \u043f\u0440\u043e \u0447\u0438\u0441\u043b\u0430?<\/p>\n<h2>\u041c\u043e\u043d\u043e\u0438\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u043d\u043e\u0438\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435?<\/p>\n<ul>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"(String, +, &quot;&quot;)\" alt=\"(String, +, &quot;&quot;)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4bd\/396\/c78\/4bd396c78c99ef468d7bf3740530e9b2.svg\"\/>&#8212; \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043a\u043e\u043d\u043a\u0430\u043d\u0442\u0435\u043d\u0430\u0446\u0438\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p><img class=\"formula inline\" source=\"(List&lt;T>, Concat(), \\{\\})&#187; alt=&#187;(List&lt;T>, Concat(), \\{\\})&#187; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c4\/289\/60a\/5c428960a6f613cacac18488b4f3d18b.svg&#187;\/>- \u0441\u043f\u0438\u0441\u043a\u0438 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"(Int32, max, -2^{31} +  1)\" alt=\"(Int32, max, -2^{31} +  1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/89f\/1b9\/dfc\/89f1b9dfc7d4966077018d4f0d59feb4.svg\"\/>&#8212; \u0438\u043d\u0442\u044b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"(Boolean, ||, false)\" alt=\"(Boolean, ||, false)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/18a\/afd\/943\/18aafd943b0915cde1304dca7c660b8a.svg\"\/>;<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043e\u0444\u043e\u0440\u043c\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<pre><code class=\"cs\">public interface ISemiGroup&lt;T> {     T Plus(T left, T right); }  public interface IMonoid&lt;T> : ISemiGroup&lt;T> {     T Zero { get; } }<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0431\u043e\u0437\u0432\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e &#171;\u043f\u043b\u044e\u0441\u043e\u043c&#187;, \u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#171;\u043d\u0443\u043b\u0451\u043c&#187;, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e (\u0441\u043f\u043e\u0439\u043b\u0435\u0440) \u0432 \u0430\u043b\u0433\u0435\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043b\u044c\u0446\u043e, \u0433\u0434\u0435 &#171;\u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435&#187; \u043e\u0442 &#171;\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f&#187; \u043d\u0430\u0434\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c. \u041d\u043e, \u043d\u0435 \u0441\u0443\u0442\u044c \u0432\u0430\u0436\u043d\u043e. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cs\">public class Max&lt;T> : ISemiGroup&lt;T> where T : IComparable&lt;T> {     public T Plus(T left, T right) =>         left.CompareTo(right) > 0             ? left             : right; }<\/code><\/pre>\n<p>\u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u043e \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c dto-\u0448\u043a\u0443.<\/p>\n<pre><code class=\"cs\">public record Person(string Name, int Money) : IComparable&lt;Person> {     public int CompareTo(Person other) => Money.CompareTo(other.Money); }<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c. \u042f \u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u0433\u0430\u0442\u0435\u0439\u0448\u0435\u0433\u043e. \u041d\u0435\u0442. \u041c\u043d\u0435 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439. \u0423 \u043c\u0435\u043d\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0441\u0442\u044c.<\/p>\n<pre><code class=\"cs\">var people = new List&lt;Person> {     new(\"Bob\", 1000),     new(\"Tim\", 1239),     new(\"Jeff\", 2000000000) };<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u043c\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0439 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">public static class SemiGroupExtension {     public static T Sum&lt;T>(this ISemiGroup&lt;T> semiGroup, IEnumerable&lt;T> elements) =>         elements.Aggregate(semiGroup.Plus); }<\/code><\/pre>\n<p>\u041d\u0443 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cs\">var max = new Max&lt;Person>(); var richest = max.Sum(people);<\/code><\/pre>\n<p>\u041c\u0430\u0433\u0438\u044f! \u041d\u043e, \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e. \u041a\u0430\u043a\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c? \u0421\u0440\u0435\u0434\u043d\u0435\u0435! \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f&#8230; \u0418\u0437 \u0447\u0435\u0433\u043e \u043e\u043d\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f: \u0438\u0437 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0441\u0443\u043c\u043c\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e <img decoding=\"async\" class=\"formula inline\" source=\"(\\mathbb{Z}^2,+,(0,0))\" alt=\"(\\mathbb{Z}^2,+,(0,0))\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c99\/09d\/912\/c9909d91241ee5b0b4f9b1bdaadad1dd.svg\"\/>. \u041e\u0444\u043e\u0440\u043c\u0438\u043c \u044d\u0442\u0443 \u043c\u044b\u0441\u043b\u044c.<\/p>\n<pre><code class=\"cs\">public class AveragedValue {     private double _sum;     private int _count;      public AveragedValue() : this(0, 0)     {     }      public AveragedValue(double sum, int count = 1)     {         _sum = sum;         _count = count;     }      public double Get() => _sum \/ _count;      public static AveragedValue operator +(AveragedValue av1, AveragedValue av2)     {         var newCount = av1._count + av2._count;         var newSum = av1._sum + av2._sum;          return new AveragedValue(newSum, newCount);     } }  public class Avg : IMonoid&lt;AveragedValue> {     public AveragedValue Plus(AveragedValue left, AveragedValue right) => left + right;      public AveragedValue Zero => new (); }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e. \u041d\u043e \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b. \u0418 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u0442\u0430\u043a\u0443\u044e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b. \u041d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043d\u043e, \u0432\u043e\u0442 \u043d\u0435\u0437\u0430\u0434\u0430\u0447\u0430, \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0443\u0440\u043e\u0434\u043b\u0438\u0432\u043e\u0435:<\/p>\n<pre><code class=\"cs\">public bool Fits(string text) =>     text ... ||     text ... ||     text ... ||     ...;<\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u043b\u0435? \u0418\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430? \u041d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0441\u0442\u0438\u043b\u0435 average javascript enjoyer, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0433\u043b\u043e\u043c. \u0424\u0438\u043b\u044c\u0442\u0440, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u043b\u0435\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0418 \u0435\u0441\u043b\u0438 &#171;\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c&#187; \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0418\u041b\u0418, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u043e\u043d\u043e\u0438\u0434!<\/p>\n<pre><code class=\"cs\">public class Any&lt;T> : IMonoid&lt;Predicate&lt;T>> {     public Predicate&lt;T> Zero => _ => false;      public Predicate&lt;T> Plus(Predicate&lt;T> left, Predicate&lt;T> right) =>         x => left(x) || right(x); }<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435. \u0412\u0441\u0451 \u0440\u0430\u0437\u043d\u0435\u0441\u0442\u0438 \u043f\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e.<\/p>\n<pre><code class=\"cs\">var predicates = new List&lt;Predicate&lt;char>> {     x => x >= '0' &amp;&amp; x &lt;= '9',     x => x >= 'A' &amp;&amp; x &lt;= 'Z',     x => x >= 'a' &amp;&amp; x &lt;= 'z' }; var anyMonoid = new Any&lt;char>(); var digitOrLetter = anyMonoid.Sum(predicates);<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u043d\u043e\u0438\u0434 \u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u0445 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0422\u043e\u0433\u0434\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e.<\/p>\n<pre><code class=\"cs\">public class MapMonoid&lt;K, V> : IMonoid&lt;Dictionary&lt;K, V>> {     private readonly ISemiGroup&lt;V> _valueSemiGroup;      public MapMonoid(ISemiGroup&lt;V> valueSemiGroup)     {         _valueSemiGroup = valueSemiGroup;     }          public Dictionary&lt;K, V> Zero => new();          public Dictionary&lt;K, V> Plus(Dictionary&lt;K, V> left, Dictionary&lt;K, V> right)     {         var result = Zero;         foreach (var (key, value) in left.Concat(right))         {             result[key] = result.ContainsKey(key)                 ? _valueSemiGroup.Plus(result[key], value)                 : value;         }                  return result;     } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a.<\/p>\n<pre><code class=\"cs\">var strings = new List&lt;string> {\"foo\", \"foo\", \"foo\", \"bar\", \"bar\", \"baz\", \"pipi\", \"pupu\"};<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u0445 \u0447\u0438\u0441\u043b\u0443 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0418\u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u0442\u0435.<\/p>\n<pre><code class=\"cs\">var dicts = strings     .Select(x => new Dictionary&lt;string, int> {{x, 1}}); var anotherDicts = strings     .Select(x => new Dictionary&lt;int, List&lt;string>>     {         {x.Length, new List&lt;string> {x}}     });<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f (\u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0441\u043f\u0438\u0441\u043a\u0438 \u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c) \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/454\/e34\/828\/454e348280fb65b53937e16c4407b8cf.png\" width=\"986\" height=\"110\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/454\/e34\/828\/454e348280fb65b53937e16c4407b8cf.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u0418\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043d\u0430\u0443\u043a \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041f\u0440\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043c\u043e\u0433\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041c\u044b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0440\u044b\u0432 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0445\u043e\u0434 \u043f\u043e\u0439\u0434\u0443\u0442 \u0442\u0435\u043e\u0440\u0435\u043c\u044b, \u0431\u043e\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c: &#171;\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430&#187;.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/655059\/\"> https:\/\/habr.com\/ru\/post\/655059\/<\/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_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u044f \u043e\u0449\u0443\u0449\u0430\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0435\u044f\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u043c\u0438, \u0430 \u043f\u0440\u043e \u0447\u0442\u043e-\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435, \u0434\u0440\u0443\u0433\u043e\u0435. \u041f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434 \u043d\u043e\u0441\u043e\u043c, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c. \u041d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u0434\u0435\u043d\u044c &#8212; \u043f\u0440\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0433\u043b\u0443. \u041d\u043e \u043d\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f.<\/p>\n<hr\/>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0412\u0423\u0417\u043e\u0432 \u0438 \u043f\u043e\u0441\u0435\u0449\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c &#171;\u0437\u0430\u0447\u0435\u043c&#187;. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d, \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442, \u0431\u044b\u043b\u0430 \u0430\u043b\u0433\u0435\u0431\u0440\u0430. \u041d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435 \u0442\u0430 \u043a\u043d\u0438\u0436\u043a\u0430 \u041c\u043e\u0440\u0434\u043a\u043e\u0432\u0438\u0447\u0430, \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u043a\u0443\u0447\u043d\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043f\u0440\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u044b \u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043e\u0431\u044a\u0451\u043c\u043d\u0430\u044f \u043d\u0430\u0443\u043a\u0430 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u043f\u043e\u0440\u043e\u0433\u043e\u043c \u0432\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0432\u043e\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u043d\u0430\u0443\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0418 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0438 \u0438\u0437 \u0447\u0435\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0438\u0445, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u043c\u044b \u0435\u0434\u0432\u0430 \u043a\u043e\u0441\u043d\u0451\u043c\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b. \u0417\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0430\u043a\u0441\u0438\u043e\u043c\u0430\u0442\u0438\u043a\u0443 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0434\u0443\u0442 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0417\u0434\u0435\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043e\u0440\u0435\u043c \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c &#8212; \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0421 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b. \u041a\u0430\u043a \u0438 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u044f\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0422\u043e \u0435\u0441\u0442\u044c, \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 &#8212; \u044d\u0442\u043e \u043f\u0430\u0440\u0430 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c .<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0441\u043e\u043a \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442 \u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0431\u043e\u0440\u0443 \u0430\u043a\u0441\u0438\u043e\u043c. \u041f\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0432\u044b\u043c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0411\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0430\u043a\u0441\u0438\u043e\u043c\u044b \u0443\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u043e\u0439. \u0427\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b? \u0415\u0441\u043b\u0438 \u0432\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043c\u044b\u0441\u043b \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 &#171;\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c&#187; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438.<\/p>\n<p> \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u00a0\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>\u041d\u0430\u0448\u0430 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u00a0&#8212; \u0443\u0436\u0435 \u043c\u043e\u043d\u043e\u0438\u0434. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u0430\u043a\u0441\u0438\u043e\u043c\u0435 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0432\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430: \u0431\u044b\u0432\u0430\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u043f\u0440\u0430\u0432\u0430 \u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u043b\u0435\u0432\u0430, \u043d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043c\u043e\u043d\u043e\u0438\u0434\u044b? \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 &#8212; . \u041d\u043e \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451 \u043f\u0440\u043e \u0447\u0438\u0441\u043b\u0430?<\/p>\n<h2>\u041c\u043e\u043d\u043e\u0438\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u043d\u043e\u0438\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435?<\/p>\n<ul>\n<li>\n<p>&#8212; \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043a\u043e\u043d\u043a\u0430\u043d\u0442\u0435\u043d\u0430\u0446\u0438\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>, Concat(), \\{\\})&#187; alt=&#187;(List&lt;T>, Concat(), \\{\\})&#187; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c4\/289\/60a\/5c428960a6f613cacac18488b4f3d18b.svg&#187;\/>- \u0441\u043f\u0438\u0441\u043a\u0438 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>&#8212; \u0438\u043d\u0442\u044b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>;<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043e\u0444\u043e\u0440\u043c\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<pre><code class=\"cs\">public interface ISemiGroup&lt;T> {     T Plus(T left, T right); }  public interface IMonoid&lt;T> : ISemiGroup&lt;T> {     T Zero { get; } }<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0431\u043e\u0437\u0432\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e &#171;\u043f\u043b\u044e\u0441\u043e\u043c&#187;, \u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#171;\u043d\u0443\u043b\u0451\u043c&#187;, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e (\u0441\u043f\u043e\u0439\u043b\u0435\u0440) \u0432 \u0430\u043b\u0433\u0435\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043b\u044c\u0446\u043e, \u0433\u0434\u0435 &#171;\u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435&#187; \u043e\u0442 &#171;\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f&#187; \u043d\u0430\u0434\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c. \u041d\u043e, \u043d\u0435 \u0441\u0443\u0442\u044c \u0432\u0430\u0436\u043d\u043e. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cs\">public class Max&lt;T> : ISemiGroup&lt;T> where T : IComparable&lt;T> {     public T Plus(T left, T right) =>         left.CompareTo(right) > 0             ? left             : right; }<\/code><\/pre>\n<p>\u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u043e \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c dto-\u0448\u043a\u0443.<\/p>\n<pre><code class=\"cs\">public record Person(string Name, int Money) : IComparable&lt;Person> {     public int CompareTo(Person other) => Money.CompareTo(other.Money); }<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c. \u042f \u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u0433\u0430\u0442\u0435\u0439\u0448\u0435\u0433\u043e. \u041d\u0435\u0442. \u041c\u043d\u0435 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439. \u0423 \u043c\u0435\u043d\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0441\u0442\u044c.<\/p>\n<pre><code class=\"cs\">var people = new List&lt;Person> {     new(\"Bob\", 1000),     new(\"Tim\", 1239),     new(\"Jeff\", 2000000000) };<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u043c\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0439 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">public static class SemiGroupExtension {     public static T Sum&lt;T>(this ISemiGroup&lt;T> semiGroup, IEnumerable&lt;T> elements) =>         elements.Aggregate(semiGroup.Plus); }<\/code><\/pre>\n<p>\u041d\u0443 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cs\">var max = new Max&lt;Person>(); var richest = max.Sum(people);<\/code><\/pre>\n<p>\u041c\u0430\u0433\u0438\u044f! \u041d\u043e, \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e. \u041a\u0430\u043a\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c? \u0421\u0440\u0435\u0434\u043d\u0435\u0435! \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f&#8230; \u0418\u0437 \u0447\u0435\u0433\u043e \u043e\u043d\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f: \u0438\u0437 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0441\u0443\u043c\u043c\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e . \u041e\u0444\u043e\u0440\u043c\u0438\u043c \u044d\u0442\u0443 \u043c\u044b\u0441\u043b\u044c.<\/p>\n<pre><code class=\"cs\">public class AveragedValue {     private double _sum;     private int _count;      public AveragedValue() : this(0, 0)     {     }      public AveragedValue(double sum, int count = 1)     {         _sum = sum;         _count = count;     }      public double Get() => _sum \/ _count;      public static AveragedValue operator +(AveragedValue av1, AveragedValue av2)     {         var newCount = av1._count + av2._count;         var newSum = av1._sum + av2._sum;          return new AveragedValue(newSum, newCount);     } }  public class Avg : IMonoid&lt;AveragedValue> {     public AveragedValue Plus(AveragedValue left, AveragedValue right) => left + right;      public AveragedValue Zero => new (); }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e. \u041d\u043e \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b. \u0418 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u0442\u0430\u043a\u0443\u044e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b. \u041d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043d\u043e, \u0432\u043e\u0442 \u043d\u0435\u0437\u0430\u0434\u0430\u0447\u0430, \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0443\u0440\u043e\u0434\u043b\u0438\u0432\u043e\u0435:<\/p>\n<pre><code class=\"cs\">public bool Fits(string text) =>     text ... ||     text ... ||     text ... ||     ...;<\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u043b\u0435? \u0418\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430? \u041d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0441\u0442\u0438\u043b\u0435 average javascript enjoyer, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0433\u043b\u043e\u043c. \u0424\u0438\u043b\u044c\u0442\u0440, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u043b\u0435\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0418 \u0435\u0441\u043b\u0438 &#171;\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c&#187; \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0418\u041b\u0418, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u043e\u043d\u043e\u0438\u0434!<\/p>\n<pre><code class=\"cs\">public class Any&lt;T> : IMonoid&lt;Predicate&lt;T>> {     public Predicate&lt;T> Zero => _ => false;      public Predicate&lt;T> Plus(Predicate&lt;T> left, Predicate&lt;T> right) =>         x => left(x) || right(x); }<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435. \u0412\u0441\u0451 \u0440\u0430\u0437\u043d\u0435\u0441\u0442\u0438 \u043f\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e.<\/p>\n<pre><code class=\"cs\">var predicates = new List&lt;Predicate&lt;char>> {     x => x >= '0' &amp;&amp; x &lt;= '9',     x => x >= 'A' &amp;&amp; x &lt;= 'Z',     x => x >= 'a' &amp;&amp; x &lt;= 'z' }; var anyMonoid = new Any&lt;char>(); var digitOrLetter = anyMonoid.Sum(predicates);<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u043d\u043e\u0438\u0434 \u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u0445 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0422\u043e\u0433\u0434\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e.<\/p>\n<pre><code class=\"cs\">public class MapMonoid&lt;K, V> : IMonoid&lt;Dictionary&lt;K, V>> {     private readonly ISemiGroup&lt;V> _valueSemiGroup;      public MapMonoid(ISemiGroup&lt;V> valueSemiGroup)     {         _valueSemiGroup = valueSemiGroup;     }          public Dictionary&lt;K, V> Zero => new();          public Dictionary&lt;K, V> Plus(Dictionary&lt;K, V> left, Dictionary&lt;K, V> right)     {         var result = Zero;         foreach (var (key, value) in left.Concat(right))         {             result[key] = result.ContainsKey(key)                 ? _valueSemiGroup.Plus(result[key], value)                 : value;         }                  return result;     } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a.<\/p>\n<pre><code class=\"cs\">var strings = new List&lt;string> {\"foo\", \"foo\", \"foo\", \"bar\", \"bar\", \"baz\", \"pipi\", \"pupu\"};<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u0445 \u0447\u0438\u0441\u043b\u0443 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0418\u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u0442\u0435.<\/p>\n<pre><code class=\"cs\">var dicts = strings     .Select(x => new Dictionary&lt;string, int> {{x, 1}}); var anotherDicts = strings     .Select(x => new Dictionary&lt;int, List&lt;string>>     {         {x.Length, new List&lt;string> {x}}     });<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f (\u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0441\u043f\u0438\u0441\u043a\u0438 \u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c) \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u0418\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043d\u0430\u0443\u043a \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041f\u0440\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043c\u043e\u0433\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041c\u044b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0440\u044b\u0432 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0445\u043e\u0434 \u043f\u043e\u0439\u0434\u0443\u0442 \u0442\u0435\u043e\u0440\u0435\u043c\u044b, \u0431\u043e\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c: &#171;\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430&#187;.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/655059\/\"> https:\/\/habr.com\/ru\/post\/655059\/<\/a><br \/><\/br><\/br><\/p>\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-330507","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330507","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=330507"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330507\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=330507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=330507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=330507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}