{"id":486205,"date":"2026-07-05T06:21:38","date_gmt":"2026-07-05T06:21:38","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=486205"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=486205","title":{"rendered":"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 8.1. \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0427\u0430\u0441\u0442\u043d\u044b\u0439, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0437\u043e\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/929144\/\" rel=\"noopener noreferrer nofollow\">Hom-\u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/article\/933016\/\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/951574\/\" rel=\"noopener noreferrer nofollow\">\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/957848\/\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u043d\u0430\u0434\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/970762\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u0435\u043b\u044b \u0438 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/p>\n<p>5\u00bd.\u00a0<a href=\"https:\/\/habr.com\/ru\/article\/edit\/1007932\/\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u043d\u0430\u0434\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/article\/1012402\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/article\/1023452\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u043e\u0432<\/a><\/p>\n<p>7\u00bd. <a href=\"https:\/\/habr.com\/ru\/articles\/1044512\/\" rel=\"noopener noreferrer nofollow\">\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430<\/a><\/p>\n<\/li>\n<\/ol>\n<p>8.1. <a href=\"https:\/\/habr.com\/ru\/article\/1055520\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432<\/a><br \/>8.2. <a href=\"https:\/\/habr.com\/ru\/articles\/1055528\/\" rel=\"noopener noreferrer nofollow\">\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432<\/a><\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#review\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#transformers\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Distributive\" rel=\"noopener noreferrer nofollow\">Distributive<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Traversable\" rel=\"noopener noreferrer nofollow\">Traversable<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#bibl\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#summary\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"review\" id=\"review\"><\/a><\/p>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h2>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u00ab\u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438\u00bb:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0437\u0430\u0431\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u00ab\u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0433\u043e \u043f\u0443\u0442\u0438\u00bb \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445,<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445,<\/p>\n<\/li>\n<li>\n<p>\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u043d\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435), <\/p>\n<\/li>\n<li>\n<p>\u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a \u043d\u0435\u043c\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u00ab\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0424\u041f-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439\u00bb \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u00bb \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u0441 \u043d\u0435\u0439 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439\u00bb. \u0414\u0430, \u0432\u044b \u0438 \u0442\u0430\u043a \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u0437 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432 \u043c\u043e\u043d\u0430\u0434\u0443. \u041d\u043e <strong>\u043b\u044e\u0431\u043e\u0439 \u043b\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043c\u043e\u043d\u0430\u0434\u0443?<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c \u0432 \u043e\u0434\u0438\u043d, \u043f\u0440\u0438\u0447\u0451\u043c \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0431\u044b\u0442\u044c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438 \u00ab\u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0435\u0439 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u00bb. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"Fa = s \\times a\" alt=\"Fa = s \\times a\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/71\/712\/712da6750b8463ee6dce62e8db6d7d94.svg\" width=\"80\" height=\"16\" data-width=\"10.932\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/71\/712\/712da6750b8463ee6dce62e8db6d7d94.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/71\/712\/712da6750b8463ee6dce62e8db6d7d94.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a <img decoding=\"async\" class=\"formula inline\" source=\"FFa = (s \\times s) \\times a\" alt=\"FFa = (s \\times s) \\times a\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/14\/14b\/14ba69061f47d3e9fbe4e3d8aea34a9f.svg\" width=\"144\" height=\"16\" data-width=\"18.214\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/14\/14b\/14ba69061f47d3e9fbe4e3d8aea34a9f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/14\/14b\/14ba69061f47d3e9fbe4e3d8aea34a9f.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb, s \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c <em>\u043c\u043e\u043d\u043e\u0438\u0434\u043e\u043c<\/em>. \u041d\u043e <em>\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u043c\u043e\u043d\u043e\u0438\u0434\u0430\u043b\u0435\u043d \u2014 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f<\/em>! \u042d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u0435 <code>cats.Writer[S, A]<\/code>. \u041d\u0435 \u0432\u0441\u044f\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u0434\u0430\u0436\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 <em>\u043c\u043e\u043d\u0430\u0434<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"F \\circ G\" alt=\"F \\circ G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b8\/b88\/b88a066dfed9c874f0216f5ac58d75f9.svg\" width=\"40\" height=\"16\" data-width=\"5.61\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b8\/b88\/b88a066dfed9c874f0216f5ac58d75f9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b8\/b88\/b88a066dfed9c874f0216f5ac58d75f9.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043e\u0439. <a href=\"https:\/\/habr.com\/ru\/articles\/957848\/#distributive\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u043d\u0435\u0435<\/a> \u043c\u044b \u0443\u0436\u0435 \u043a\u0430\u0441\u0430\u043b\u0438\u0441\u044c \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0442\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c <em>\u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d<\/em> \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\lambda \\colon G \\circ F \\rightsquigarrow F \\circ G\" alt=\"\\lambda \\colon G \\circ F \\rightsquigarrow F \\circ G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2a\/2ab\/2abecdd9d9f393ed0a18950b1b057a28.svg\" width=\"136\" height=\"16\" data-width=\"17.064\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2a\/2ab\/2abecdd9d9f393ed0a18950b1b057a28.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2a\/2ab\/2abecdd9d9f393ed0a18950b1b057a28.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u043d\u0430\u0434 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c! \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0422\u0443\u0442 \u043d\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d \u043e\u0433\u043e\u0440\u0447\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0435\u0434\u0435\u0442\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439). \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0431\u0443\u0434\u0435\u043c \u043b\u0438 \u043c\u044b \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0438 \u043b\u0438\u0448\u044c \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0438\u0437 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043b\u0438 \u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u00bb \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0443 \u0434\u043b\u044f Writer[String] \u2218 List<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443:<\/p>\n<pre><code class=\"scala\">type Writer[S] = [A] =&gt;&gt; S \u00d7 A  type M = Writer[String] \u2218 List \/\/ [A] =&gt;&gt; (String, List[A])  def flatMap[A, B](fa: M[A])(f: A =&gt; M[B]): M[B] = {    val (log, list) = fa    val results = list.map(f) \/\/ List[(String, List[B])]    val combinedLog = results.foldLeft(log)(_ + _._1) \/\/ \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043d\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430!  val combinedValues = results.flatMap(_._2)    combinedLog -&gt; combinedValues  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0438\u043f\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043d\u043e\u0438\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430! \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>flatMap<\/code> \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c:<\/p>\n<pre><code class=\"scala\">def f(x: Int): M[Int] = (s\" f($x) \", List(x * 10))  def g(y: Int): M[Int] = (s\" g($y) \", List(y * 10))    val m = (\"start\", List(1, 2))    flatMap(flatMap(m)(     f  ))(g)  \/\/ (\"start f(1)  f(2)  g(10)  g(20) \", List(100, 200))flatMap(m)(x =&gt; flatMap(f(x))(g)) \/\/ (\"start f(1)  g(10)  f(2)  g(20) \", List(100, 200)) \/\/               \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>flatMap<\/code> \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e \u0441\u0445\u043e\u0436\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <code>List \u2218 List<\/code>.<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"transformers\" id=\"transformers\"><\/a><\/p>\n<h2>\u041c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b<\/h2>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0435\u00bb (\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435) \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0418 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 <em>\u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432<\/em>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0442\u0430\u043a\u0430\u044f: \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 <em>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445<\/em> \u043c\u043e\u043d\u0430\u0434 <img decoding=\"async\" class=\"formula inline\" source=\"G\\colon \\mathrm{Mon}_\\mathcal{C}\" alt=\"G\\colon \\mathrm{Mon}_\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/53\/539\/5399ae226205fb049e591e5ef1aff4fe.svg\" width=\"64\" height=\"16\" data-width=\"8.279\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/53\/539\/5399ae226205fb049e591e5ef1aff4fe.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/53\/539\/5399ae226205fb049e591e5ef1aff4fe.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"GT\\colon \\mathrm{Mon}_\\mathcal{C} \\to \\mathrm{Mon}_\\mathcal{C}\" alt=\"GT\\colon \\mathrm{Mon}_\\mathcal{C} \\to \\mathrm{Mon}_\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4bf\/4bf03ac9613cad5d107ecdd9f51d8d7b.svg\" width=\"144\" height=\"16\" data-width=\"18.886\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4bf\/4bf03ac9613cad5d107ecdd9f51d8d7b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4bf\/4bf03ac9613cad5d107ecdd9f51d8d7b.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b <img decoding=\"async\" class=\"formula inline\" source=\"F\\colon \\mathrm{Mon}_\\mathcal{C}\" alt=\"F\\colon \\mathrm{Mon}_\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d0d\/d0d5ad52b7dceb8c8fc884678336a628.svg\" width=\"64\" height=\"16\" data-width=\"8.195\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d0d\/d0d5ad52b7dceb8c8fc884678336a628.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d0d\/d0d5ad52b7dceb8c8fc884678336a628.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"GT\\, F \\cong F \\circ G\" alt=\"GT\\, F \\cong F \\circ G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0b\/0b5\/0b52f8235f5c7008d110989a04075803.svg\" width=\"112\" height=\"16\" data-width=\"14.07\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0b\/0b5\/0b52f8235f5c7008d110989a04075803.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0b\/0b5\/0b52f8235f5c7008d110989a04075803.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d <em>\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 \u043f\u0440\u0435\u0434\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>: <img decoding=\"async\" class=\"formula inline\" source=\"GT \\cong \\_ \\circ G\" alt=\"GT \\cong \\_ \\circ G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/39\/39f\/39f2fe584fc48ee2a8b32b7d5522510f.svg\" width=\"88\" height=\"16\" data-width=\"11.434\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/39\/39f\/39f2fe584fc48ee2a8b32b7d5522510f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/39\/39f\/39f2fe584fc48ee2a8b32b7d5522510f.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0434\u0430\u0451\u0442 \u043c\u043e\u043d\u0430\u0434\u0443.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u043d\u0430\u0434 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0439 <em>\u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d<\/em><img decoding=\"async\" class=\"formula inline\" source=\" \\lambda\\colon F \\circ G \\rightsquigarrow G \\circ F\" alt=\" \\lambda\\colon F \\circ G \\rightsquigarrow G \\circ F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f27\/f27cd7cebe908e9378e4dae677ef92ba.svg\" width=\"136\" height=\"16\" data-width=\"17.064\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f27\/f27cd7cebe908e9378e4dae677ef92ba.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f27\/f27cd7cebe908e9378e4dae677ef92ba.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f <code>Option<\/code>:<\/p>\n<pre><code class=\"scala\">type OptionT[F[_]] = [A] =&gt;&gt; F[Option[A]]type Swap[F[_], G[_]] = (F \u2218 G) ~&gt; (G \u2218 F) \/\/ \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435given optionMonad: Monad[Option] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: Option[A]).map(f),    pure = [A] =&gt; (a: A) =&gt; Some(a),    flatten = [A] =&gt; (ooa: Option[Option[A]]) =&gt; ooa.flatten,  )\/\/ \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0434\u043b\u044f Option \u0441 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438given swapOptionT[F[_]: Monad as F]: Swap[Option, F] =    [A] =&gt; _.fold(F.pure(None))(F.fmap(optionMonad.pure[A]))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b:<\/p>\n<pre><code class=\"scala\">given composeMonads: [F[_]: Monad as F, G[_]: Monad as G] =&gt; ((swap: Swap[G, F]) ?=&gt; Monad[F \u2218 G]) = (    fmap = compFunctor[F, G],    pure = [A] =&gt; (a: A) =&gt; F.pure(G.pure(a)), \/\/ F.pure \u2218 G.pure  flatten = [A] =&gt; (fgfga: F[G[F[G[A]]]]) =&gt; \/\/ (F.flatten \u2218 G.flatten) \u22c5 (id[F] \u2218 swap \u2218 id[G])    (F.fmap(G.flatten[A]) compose F.flatten[G[G[A]]] compose F.fmap(swap[G[A]]))(fgfga))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>composeMonads<\/code> \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u0443 \u0438\u0434\u0435\u044e \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041d\u043e \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0432\u0432\u0438\u0434\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043e\u043d \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<pre><code class=\"scala\">case class MonadTransformer[F[_]: Monad as F, G[_]: Monad as G, A](value: F[G[A]])(using swap: Swap[G, F]):    def flatMap[B](f: A =&gt; MonadTransformer[F, G, B]): MonadTransformer[F, G, B] =      MonadTransformer(value        .flatMap(F.fmap(G.flatten[B]) compose swap[G[B]] compose G.fmap(f andThen {_.value}))      )      def map[B](f: A =&gt; B): MonadTransformer[F, G, B] =      flatMap(f `andThen` G.pure[B] `andThen` F.pure[G[B]] `andThen` MonadTransformer.apply) end MonadTransformer  type MonadT[G[_]] = [F[_]] =&gt;&gt; [A] =&gt;&gt; MonadTransformer[F, G, A]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 OptionT<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0432\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 <code>OptionT<\/code> <s>\u0441 \u0431\u043b\u0435\u043a-\u0434\u0436\u0435\u043a\u043e\u043c \u0438<\/s>\u2026<\/p>\n<pre><code class=\"scala\">type OptionT = MonadT[Option]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b <code>optionMonad: Monad[Option]<\/code> \u0438 <code>swapOptionT Swap[Option, F]<\/code> \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u0443\u0435\u043c \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 <code>OptionT[IO] \u2245 IO \u2218 Option<\/code>:<\/p>\n<pre><code class=\"scala\">\/\/ \u043d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434\u044b \u0434\u043b\u044f \u00ab\u043a\u043e\u0448\u0430\u0447\u044c\u0435\u0433\u043e\u00bb IOgiven ioMonad: Monad[IO] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: IO[A]).map(f),    pure = [A] =&gt; (a: A) =&gt; IO.pure(a), \/\/.pure(a),    flatten = [A] =&gt; (iia: IO[IO[A]]) =&gt; iia.flatten,  )  val findUserId:   UserName =&gt; OptionT[IO][UserId]      = _ =&gt; MonadTransformer(IO.pure(Some(42)))  val findCustomer: UserId   =&gt; OptionT[IO][Customer]    = _ =&gt; MonadTransformer(IO.pure(Some(\"\u043a\u0443\u0441\u0442\u043e\u043c\u0435\u0440\")))  val findPhone:    Customer =&gt; OptionT[IO][PhoneNumber] = _ =&gt; MonadTransformer(IO.pure(Some(\"03\")))val userPhone =    for      userId   &lt;- findUserId(\"\u042e\u0437\u0432\u0435\u0440\u044c\")      customer &lt;- findCustomer(userId)      phone    &lt;- findPhone(customer)    yield phoneuserPhone.value.unsafeRunSync() \/\/ Some(03)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 <a href=\"http:\/\/cats.data\" rel=\"noopener noreferrer nofollow\"><code>cats.data<\/code><\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><code>OptionT<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>EitherT<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>ReaderT<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>WriterT<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>StateT<\/code> \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Scalaz \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 <code>ListT<\/code>, \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u044b \u043c\u043e\u043d\u0430\u0434\u044b. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f <code>List<\/code> \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u0440\u044b Cats \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c.<\/p>\n<p>\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"scala\">type TotalEffect[A] = ReaderT[EitherT[StateT[IO, S, *], E, *], R, A]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u00ab\u043c\u0438\u0440 <code>TotalEffect<\/code>\u00bb, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/typelevel.org\/cats-mtl\/\" rel=\"noopener noreferrer nofollow\">Cats.MTL<\/a> \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f <em>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438<\/em>. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u2014 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435\u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430\u044f, \u0447\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u0443\u0436\u0435 \u043a \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u0430\u0436\u0435 \u0441 MTL \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0442\u044f\u0436\u0451\u043b\u044b\u043c\u0438: \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0443\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 MTL), \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 IDE \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 ZIO \u2014 \u0435\u0451 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 <code>IO<\/code>:<\/p>\n<pre><code class=\"scala\">\/\/ (ReaderT[R] \u2218 EitherT[E] \u2218 IO)[A] \u2245 R =&gt; IO[E `Either` A]type ZIO[R, E, A] = ReaderT[EitherT[IO, E, *], R, A]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u0432\u0442\u043e\u0440\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043b\u044c\u0442\u0438\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430 \u0438\u0445 \u0432\u0437\u0433\u043b\u044f\u0434) \u044d\u0444\u0444\u0435\u043a\u0442\u044b.<\/p>\n<p><a class=\"anchor\" name=\"Distributive\" id=\"Distributive\"><\/a><\/p>\n<h2>Distributive<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d<img decoding=\"async\" class=\"formula inline\" source=\" \\lambda^G(F)\\colon F \\circ G \\rightsquigarrow G \\circ F\" alt=\" \\lambda^G(F)\\colon F \\circ G \\rightsquigarrow G \\circ F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/112\/112ed2fb312e3d85d6d44e78b2c2e351.svg\" width=\"168\" height=\"16\" data-width=\"21.964\" data-height=\"2.628\" data-vertical-align=\"-0.748\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/112\/112ed2fb312e3d85d6d44e78b2c2e351.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/112\/112ed2fb312e3d85d6d44e78b2c2e351.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043b\u044f <em>\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/em> \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0434\u043b\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"scala\">type Distributive[G[_]] = [F[_], A] =&gt; (F \u2218 G)[A] =&gt; (G \u2218 F)[A] \/\/ (F \u2218 G) ~&gt; (G \u2218 F)\/\/ \u0438\u043b\u0438 swap))def flip[F[_]: Functor, G[_]: Distributive as distribute]: (F \u2218 G) ~&gt; (G \u2218 F) = [A] =&gt; distribute(_)extension [F[_], G[_]: Distributive as swap, A](fga: F[G[A]])    def cosequence: G[F[A]] = swap(fga)    extension [F[_]: Functor, A](fa: F[A])    def distribute[G[_]: Distributive, B](agb: A =&gt; G[B]): G[F[B]] = fa.map(agb).cosequence<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c:<\/p>\n<pre><code class=\"scala\">type Reader[R] = [A] =&gt;&gt; R =&gt; Agiven distributiveReader: [R] =&gt; Distributive[Reader[R]] =    [F[_]: Functor, A] =&gt; (fga: F[Reader[R][A]]) =&gt; r =&gt; fga.map(_(r))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u043c, \u0442\u043e\u0433\u0434\u0430 \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 <code>composeMonads<\/code> \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">case class DistributiveT[F[_]: {Monad, Distributive}, G[_]: Monad, A](value: (F \u2218 G)[A])  type DistrT[F[_], G[_]] = [A] =&gt;&gt; DistributiveT[F, G, A]    given distrTMonad: [F[_]: {Monad as F, Distributive}, G[_]: Monad as G] =&gt; Monad[DistrT[F, G]] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: DistrT[F, G][A]) =&gt; DistributiveT(compFunctor[F, G](f)(fga.value)),    pure = [A] =&gt; (a: A) =&gt; DistributiveT(F.pure(G.pure(a))),    flatten = [A] =&gt; (fgfga: DistrT[F, G][DistrT[F, G][A]]) =&gt; DistributiveT(    (F.fmap(G.flatten[A]) compose F.flatten[G[G[A]]] compose F.fmap(flip[G, F][G[A]]))(        fmap[F \u2218 G]((_: DistrT[F, G][A]).value)(fgfga.value)     )  \/\/ \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f distributiveReader, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435  )  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435, \u0430 \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0430\u043d\u0430\u0442\u043e\u043c\u0438\u044e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432. \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\lambda^G(F)\" alt=\"\\lambda^G(F)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b7\/2b7d8a627a221360c69ce1c95f624776.svg\" width=\"48\" height=\"16\" data-width=\"6.219\" data-height=\"2.628\" data-vertical-align=\"-0.748\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b7\/2b7d8a627a221360c69ce1c95f624776.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b7\/2b7d8a627a221360c69ce1c95f624776.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u043c\u0435\u0441\u0442\u043e <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b (\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u2026) \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 G <em>\u043e\u0431\u044f\u0437\u0430\u043d<\/em> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044b. <a href=\"https:\/\/habr.com\/ru\/articles\/970762\/#continuty\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u043d\u0435\u0435<\/a> \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <em>\u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438<\/em>.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f <a href=\"https:\/\/math.berkeley.edu\/~willfisher\/papers\/Category_Theory_Notes.pdf#page=6&amp;zoom=100,132,749\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043e\u0440\u0435\u043c\u0430 \u0424\u0440\u0435\u0439\u0434\u0430 \u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u043e\u0441\u0442\u0438<\/a>, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u044e\u0431\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u00ab\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0439\u00bb \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 (\u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"Ga \\cong \\mathrm{Hom}(r, a)\" alt=\"Ga \\cong \\mathrm{Hom}(r, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3d\/3d3\/3d38ed4b43ee370b2fc658fb5bfb055d.svg\" width=\"120\" height=\"16\" data-width=\"15.688\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3d\/3d3\/3d38ed4b43ee370b2fc658fb5bfb055d.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3d\/3d3\/3d38ed4b43ee370b2fc658fb5bfb055d.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 r, \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e\u00bb \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440.<\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 <code>RepresentableR<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"scala\">infix type \u2245\u2245[F[_], G[_]] = ( \/\/ \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432  right: F ~&gt; G,    left : G ~&gt; F  )  type RepresentableR[R] = [G[_]] =&gt;&gt; G \u2245\u2245 Reader[R]def tabulate[R, G[_]: RepresentableR[R] as rep]: Reader[R] ~&gt; G = rep.left    extension [R, G[_]: RepresentableR[R] as rep, A](ga: G[A])    def index: R =&gt; A = rep.right(ga)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>R<\/code> \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u00bb \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>tabulate<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438\u0437 <em>\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, <code>index<\/code> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0442\u0438\u043f\u0430 <code>R<\/code>.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043b\u0435\u043c\u043c\u0443 \u0419\u043e\u043d\u0435\u0434\u044b, \u0432\u044b\u0432\u043e\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043e\u043a\u00bb \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"r=\\int_a \\mathrm{Hom}(Ga, a).\" alt=\"r=\\int_a \\mathrm{Hom}(Ga, a).\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f28\/f28e38e580af90de7afd21897e4cc47f.svg\" width=\"144\" height=\"40\" data-width=\"18.986\" data-height=\"5.123\" data-vertical-align=\"-1.996\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f28\/f28e38e580af90de7afd21897e4cc47f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f28\/f28e38e580af90de7afd21897e4cc47f.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0447\u0442\u043e \u0438\u043d\u043e\u0435 \u043a\u0430\u043a \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb:<\/p>\n<pre><code class=\"scala\">type Rep[G[_]] = G ~&gt; Id \/\/ \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430  type Representable[G[_]] = RepresentableR[Rep[G]][G]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u00bb \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u0440\u0435\u0434\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u00ab\u043f\u0443\u0441\u0442\u044b\u0445\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>over<\/code> \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">extension[F1[_], F2[_]] (\u03b1: F1 ~&gt; F2) \/\/ \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 F2 !!    def over[G[_]]: (F1 \u2218 G) ~&gt; (F2 \u2218 G) = [A] =&gt; \u03b1(_) \/\/ \u03b1 \u2218 id[G]  given distributiveFromRepresentable: [R, G[_]: RepresentableR[R] as rep] =&gt; Distributive[G] =    [F[_]: Functor, A] =&gt;      (tabulate.over[F] \u22c5 flip[F, Reader[R]] \u22c5 (id[F] \u2218 rep.right))(_)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0436\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b? \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>Reader<\/code>, \u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 <em>\u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0435<\/em> \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type Pair[A] = A \u00d7 Agiven representablePair: Representable[Pair] = (    right = [A] =&gt; (pair: Pair[A]) =&gt; (_: Rep[Pair])(pair),    left  = [A] =&gt; (rr: Reader[Rep[Pair]][A]) =&gt; rr([B] =&gt; _._1) -&gt; rr([B] =&gt; _._2)  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c\u00bb \u043f\u0430\u0440\u044b, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Rep[Pair]<\/code>, \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d \u0442\u0438\u043f\u0443 <code>Boolean<\/code>, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0435\u043c\u0443 \u043b\u0438\u0448\u044c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u043a\u043e\u0440\u0442\u0435\u0436\u0435. \u0417\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"scala\">val repPairIso: Rep[Pair] \u2245 Boolean = ( \/\/ \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u0434\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438  right = _(true -&gt; false),    left  = b =&gt; [A] =&gt; pair =&gt; if b then pair._1 else pair._2  )given representableRPair: RepresentableR[Boolean][Pair] = (    right = [A] =&gt; (pair: Pair[A]) =&gt; (b: Boolean) =&gt; if b then pair._1 else pair._2,    left  = [A] =&gt; (rr: Reader[Boolean][A]) =&gt; rr(true) -&gt; rr(false)  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u043d\u0430\u0434\u044b <code>Pair<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">given pairMonad: Monad[Pair] = (    fmap    = [A, B] =&gt; (f: A =&gt; B) =&gt; (p: Pair[A]) =&gt; f(p._1) -&gt; f(p._2),    pure    = [A] =&gt; (a: A) =&gt; a -&gt; a,    flatten = [A] =&gt; (ppa: Pair[Pair[A]]) =&gt; ppa._1._1 -&gt; ppa._2._2  )val optPair = DistributiveT[Pair, Option, Int](Some(1) -&gt; Some(2))  def modifyInOptionsPair(i: Int) = DistributiveT[Pair, Option, Int](Some(i * 100) -&gt; Some(i + 40))optPair.flatMap(modifyInOptionsPair)\/\/ DistributiveT((Some(100),Some(42)))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/863376\/#rec_derivatives\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0437\u043e\u0440\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/a> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0438\u043f, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440: \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438:<\/p>\n<pre><code class=\"scala\">enum Nat: \/\/ \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430  case Z    case S(prev: Nat)    case class Stream[A](value: A, cons: () =&gt; Stream[A]):    def map[B](f: A =&gt; B): Stream[B] =      Stream(f(value), () =&gt; cons().map(f))      def index: Nat =&gt; A =      case Nat.Z    =&gt; value      case Nat.S(p) =&gt; cons().index(p)  end Stream  def nats: Stream[Nat] = Stream(Nat.Z, () =&gt; nats.map(n =&gt; Nat.S(n)))    \/\/ \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043cval repStreamIso: Rep[Stream] \u2245 Nat = (  right = _(nats),    left  = n =&gt; [_] =&gt; _.index(n)  )  end repStreamIso    val stream =  Stream(4,  \/\/ 0 \u2245     Z        () =&gt; Stream(2,  \/\/ 1 \u2245   S(Z)        () =&gt; Stream(42, \/\/ 2 \u2245 S(S(Z))        () =&gt; ???)))    import Nat.*  val two = S(S(Z))stream.index(two) \/\/ 42<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"Traversable\" id=\"Traversable\"><\/a><\/p>\n<h2>Traversable<\/h2>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Distributive<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u00ab\u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u00bb \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e <em>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e<\/em> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0430\u0440\u0443\u0436\u0443 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043b\u044e\u0431\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c. \u041a \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b. \u0427\u0442\u043e \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043c\u043e\u0436\u043d\u043e \u00ab\u0432\u043b\u043e\u0436\u0438\u0442\u044c\u00bb \u0432 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439?<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"scala\">type Codistributive[F[_]] = [G[_], A] =&gt; (F \u2218 G)[A] =&gt; (G \u2218 F)[A] \/\/ Swap[F, G]def flap[F[_]: Codistributive as codistributive, G[_]: Applicative]: (F \u2218 G) ~&gt; (G \u2218 F) =  [A] =&gt; codistributive(_)    extension [F[_]: Codistributive as codistributive, G[_]: Applicative, A](fga: F[G[A]])    def sequence: G[F[A]] = codistributive(fga)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <code>Distributive<\/code>, \u043d\u043e \u043d\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0443\u0436\u0435 \u00ab\u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e\u00bb \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>F[_]<\/code>.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u043e \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043f\u0440\u0438 \u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u0443\u043c\u043c\u0430, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u043e\u0433\u043e <code>F[_]<\/code>, \u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>F<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0442\u0430\u0449\u0438\u0442\u044c \u043d\u0430\u0440\u0443\u0436\u0443 \u0447\u0435\u0440\u0435\u0437 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440. \u0415\u0441\u043b\u0438 \u0436\u0435 <code>F<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c, \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e \u0432\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u043d\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u0447\u044c\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043b\u0438\u0448\u044c <em>\u043f\u043e\u043b\u0438\u043d\u043e\u043c\u0438\u0430\u043b\u044c\u043d\u044b\u0435<\/em> \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u0447\u044c\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438\u0448\u044c \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0440\u044f\u0434\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"Fa \\cong \\sum_{n=0} c_n \\times a^n.\" alt=\"Fa \\cong \\sum_{n=0} c_n \\times a^n.\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/858\/858054268eeb14a2b3aebfe94a3963c4.svg\" width=\"136\" height=\"32\" data-width=\"17.419\" data-height=\"4.968\" data-vertical-align=\"-1.918\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/858\/858054268eeb14a2b3aebfe94a3963c4.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/858\/858054268eeb14a2b3aebfe94a3963c4.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0412 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u044f\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 n \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 a. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u0434\u043b\u044f \u043f\u043e\u043b\u0438\u043d\u043e\u043c\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u00ab\u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f\u00bb (traverse) \u043f\u043e \u043d\u0438\u043c. \u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <em>\u0444\u043e\u0440\u043c\u0443<\/em> \u0438 <em>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/em>:<\/p>\n<pre><code class=\"scala\">type ShapedCollection[F[_]] = [A] =&gt;&gt; (shape: F[Unit], values: List[A])    type Listable[F[_]] = ( \/\/ \u044d\u0442\u043e \u043d\u0435 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c!    decompose: F ~&gt; ShapedCollection[F],    recompose: ShapedCollection[F] ~&gt; F,  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Listable[F[_]]<\/code> \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044e <code>recompose \u2218 decompose = id[F]<\/code>, \u043d\u043e \u0432\u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0435 \u0434\u0430\u0441\u0442 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0430: <code>decompose \u2218 recompose \u2260 id[ShapedCollection[F]]<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f <code>ShapedCollection[F]<\/code> \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 <code>F<\/code> \u2014 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432 \u044d\u0442\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0414\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"F\" alt=\"F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg\" width=\"12\" height=\"12\" data-width=\"1.695\" data-height=\"1.538\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/80\/800\/800618943025315f869e4e1f09471012.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441 \u043d\u0435\u043a\u0438\u043c <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u044c:<img decoding=\"async\" class=\"formula inline\" source=\" c_n \\times (Ga)^n \\to G(c_n \\times a^n)\" alt=\" c_n \\times (Ga)^n \\to G(c_n \\times a^n)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5b\/c5b2d45a710b1a2cef51383f0133d89f.svg\" width=\"200\" height=\"16\" data-width=\"25.071\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5b\/c5b2d45a710b1a2cef51383f0133d89f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5b\/c5b2d45a710b1a2cef51383f0133d89f.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e <img decoding=\"async\" class=\"formula inline\" source=\"n\" alt=\"n\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg\" width=\"12\" height=\"12\" data-width=\"1.357\" data-height=\"1.025\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0417\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0435\u0449\u0451 \u0438 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"G\" alt=\"G\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg\" width=\"12\" height=\"12\" data-width=\"1.778\" data-height=\"1.645\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/df\/dfc\/dfcf28d0734569a6a693bc8194de62bf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} Ga \\times Gb &amp;\\to G(a \\times b), \\\\ a &amp;\\to Ga. \\end{split}\" alt=\"\\begin{split} Ga \\times Gb &amp;\\to G(a \\times b), \\\\ a &amp;\\to Ga. \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/23\/230\/230c68d4d7d86d983e03a41e89191041.svg\" width=\"168\" height=\"40\" data-width=\"21.11\" data-height=\"5.204\" data-vertical-align=\"-2.036\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/23\/230\/230c68d4d7d86d983e03a41e89191041.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/23\/230\/230c68d4d7d86d983e03a41e89191041.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u0430\u044f (\u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, lax) \u043c\u043e\u043d\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043f\u0443\u0441\u0442\u044b\u0435. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435 \u0443\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/957848\/#applicative\" rel=\"noopener noreferrer nofollow\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c<\/a>, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <em>\u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/em>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u043e\u043d\u0430 \u0441 <em>\u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/em>:<\/p>\n<pre><code class=\"scala\">type Swap2[Bi[_, _], F[_]] = [A, B] =&gt; Bi[F[A], F[B]] =&gt; F[Bi[A, B]]  type Tupled[F[_]] = Swap2[\u00d7, F] \/\/ [A, B] =&gt; (F[A], F[B]) =&gt; F[(A, B)]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">type Applicative[F[_]] = (    fmap:  Functor[F],    tupled: Tupled[F],    pure:     Pure[F],  )  def fmap2[F[_]: Applicative as F, A, B, C](abc: (A, B) =&gt; C): ((F[A], F[B])) =&gt; F[C] =    F.tupled(_, _).map(abc.tupled)    extension [F[_]: Applicative as F, A, B](fafb: (F[A], F[B]))    def map2[C](abc: (A, B) =&gt; C): F[C] = fmap2(abc)(fafb)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 given<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0410\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e, \u043e\u0431\u043e\u0433\u0430\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u043c \u0437\u0430\u043a\u043e\u043d\u043e\u043c \u0441 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432.<\/p>\n<pre><code class=\"scala\">given applicative: [F[_]] =&gt; (Functor[F] ?=&gt; Pure[F] ?=&gt; Tupled[F] ?=&gt; Applicative[F]) = (  fmap   = summon[Functor[F]],    tupled = summon[ Tupled[F]],    pure   = summon[   Pure[F]]  )given functorFromApplicative: [F[_]: Applicative as F] =&gt; Functor[F] = F.fmapgiven applicativeFromMonad: [F[_]: Monad as F] =&gt; Applicative[F] = (    fmap   = F.fmap,    tupled = [A, B] =&gt; (fafb: (F[A], F[B])) =&gt; fafb._1.flatMap(a =&gt; fafb._2.map(a -&gt; _)),    pure   = F.pure  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430, \u043c\u043e\u043d\u0430\u0434\u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">given codistributive: [F[_]: Listable as listable] =&gt; Codistributive[F] =    [G[_]: Applicative as G, A] =&gt; (fga: (F \u2218 G)[A]) =&gt;      val (shape, listGA) = listable.decompose(fga)  \/\/ (F[Unit], List[G[A]])      listGA        .foldRight[G[List[A]]](G.pure(Nil))((ga, la) =&gt; G.tupled(ga, la).map(_ +: _))        .map(listable.recompose(shape, _))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Cats \u0437\u0430 \u0442\u0435 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Traverse<\/code>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043e\u0444\u043e\u0440\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">case class TraversableT[F[_]: Monad, G[_]: {Monad, Codistributive}, A](value: (F \u2218 G)[A])    type TravT[F[_], G[_]] = [A] =&gt;&gt; TraversableT[F, G, A]    given travTMonad: [F[_]: {Monad as F}, G[_]: {Monad as G, Codistributive}] =&gt; Monad[TravT[F, G]] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: TravT[F, G][A]) =&gt; TraversableT(compFunctor[F, G](f)(fga.value)),    pure = [A] =&gt; (a: A) =&gt; TraversableT(F.pure(G.pure(a))),    flatten = [A] =&gt; (fgfga: TravT[F, G][TravT[F, G][A]]) =&gt; TraversableT(      (F.fmap(G.flatten[A]) compose F.flatten[G[G[A]]] compose F.fmap(flap[G, F][G[A]]))(        fmap[F \u2218 G]((_: TravT[F, G][A]).value)(fgfga.value)      )    )  )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <code>Applicative<\/code> \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 <code>travTMonad<\/code>. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 <code>distrTMonad<\/code> \u043b\u0438\u0448\u044c \u0442\u0435\u043c, \u0447\u0442\u043e (\u043a\u043e)\u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0441\u0443\u0449\u0435 \u0443\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443, \u0430 \u043d\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043c\u043e\u043d\u0430\u0434\u0443 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>Reader[String] \u2218 Option<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>Listable[Option]<\/code>:<\/p>\n<pre><code class=\"scala\">type ReaderOfOptions = TravT[Reader[String], Option] \/\/ Reader[String] \u2218 Option  given readerMonad: [R] =&gt; Monad[Reader[R]] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (ra: Reader[R][A]) =&gt; f `compose` ra,    pure = [A] =&gt; (a: A) =&gt; (_: R) =&gt; a,    flatten = [A] =&gt; (rra: Reader[R][Reader[R][A]]) =&gt; (r: R) =&gt; rra(r)(r)  )  given listableOption: Listable[Option] = (    decompose = [A] =&gt; (oa: Option[A]) =&gt; oa.map(_ =&gt; ()) -&gt; oa.toList,    recompose = [A] =&gt; (sa: ShapedCollection[Option][A]) =&gt; sa.values.headOption, \/\/ \u0444\u043e\u0440\u043c\u0430 \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c  )  val optReader = TraversableT[Reader[String], Option, Int](_.toIntOption)  def modifyInOptionsReader(i: Int) =    TraversableT[Reader[String], Option, Int](str =&gt; Option.unless(str.isBlank)(i))optReader.flatMap(modifyInOptionsReader).value(\"42\")\/\/ Some(42)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"bibl\" id=\"bibl\"><\/a><\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430<\/h2>\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434 <\/p>\n<ul>\n<li>\n<p>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0445 <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/link.springer.com\/chapter\/10.1007\/978-1-4471-3215-8_12\" rel=\"noopener noreferrer nofollow\">Combining Monads<\/a> \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f 1992 \u0433\u043e\u0434\u0430 \u0414\u044d\u0432\u0438\u0434\u0430 \u041a\u0438\u043d\u0433\u0430 \u0438 \u0424\u0438\u043b\u0438\u043f\u0430 \u0423\u043e\u0434\u043b\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/web.cecs.pdx.edu\/~mpj\/pubs\/RR-1004.pdf\" rel=\"noopener noreferrer nofollow\">Composing monads<\/a> \u0441\u0442\u0430\u0442\u044c\u044f 1993 \u0433\u043e\u0434\u0430 \u041c\u0430\u0440\u043a\u0430 \u0414\u0436\u043e\u043d\u0441\u0430 \u0438 \u041b\u044e\u043a\u0430 \u0414\u044e\u043f\u043e\u043d\u0448\u0435\u043b\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.staff.city.ac.uk\/~ross\/papers\/Applicative.pdf\" rel=\"noopener noreferrer nofollow\">Applicative programming with effects<\/a> \u0441\u0442\u0430\u0442\u044c\u044f 2005 \u0433\u043e\u0434\u0430 \u041a\u043e\u043d\u043e\u0440\u0430 \u041c\u0430\u043a\u0431\u0440\u0430\u0439\u0434\u0430 \u0438 \u0420\u043e\u0441\u0441\u0430 \u041f\u0430\u0442\u0435\u0440\u0441\u043e\u043d\u0430<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0441\u043e Stack Overflow: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/33149471\/why-do-monads-not-compose-in-scala\" rel=\"noopener noreferrer nofollow\">Why do monads not compose in scala<\/a> .<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/7040844\/applicatives-compose-monads-dont\" rel=\"noopener noreferrer nofollow\">Applicatives compose, monads don&#8217;t<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Distributive <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/en.m.wikipedia.org\/wiki\/Distributive_law_between_monads\" rel=\"noopener noreferrer nofollow\">Distributive law between monads<\/a> Wikipedia<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.siawyoung.com\/representable-functors\/\" rel=\"noopener noreferrer nofollow\">Representable Functors<\/a> \u043f\u043e\u0441\u0442 \u0421\u0438\u0430\u0443 \u042f\u043d\u0433\u0430 \u0432 \u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0435<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/duplode.github.io\/posts\/every-distributive-is-representable.html\" rel=\"noopener noreferrer nofollow\">Every Distributive is Representable<\/a> \u043f\u043e\u0441\u0442 \u0414\u044d\u043d\u0438\u0435\u043b\u0430 \u041c\u043b\u043e\u0442\u0430 \u0432 \u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0435<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/54261967\/what-is-representable-used-for-in-haskell\" rel=\"noopener noreferrer nofollow\">What is Representable used for in Haskell?<\/a> Stack Overflow<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/bartoszmilewski.com\/2015\/07\/29\/representable-functors\/\" rel=\"noopener noreferrer nofollow\">Representable Functors<\/a> \u043f\u043e\u0441\u0442 \u0432 \u041a\u0430\u0444\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0411\u0430\u0440\u0442\u043e\u0448\u0430 \u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Traversable <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/scalabook.ru\/typeclass\/monad\/traverse.html\" rel=\"noopener noreferrer nofollow\">Scalabook.ru\/Traverse<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/typelevel.org\/cats\/typeclasses\/traverse.html\" rel=\"noopener noreferrer nofollow\">Cats.Traverse<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/714532\/\" rel=\"noopener noreferrer nofollow\">\u0413\u0440\u043e\u043a\u0430\u0435\u043c Traversable<\/a> \u0425\u0430\u0431\u0440-\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u041c\u044d\u0442\u0442\u0430 \u0422\u043e\u0440\u043d\u0442\u043e\u043d\u0430 \u043f\u0440\u043e F#<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ru.wikibooks.org\/wiki\/Haskell\/Traversable\" rel=\"noopener noreferrer nofollow\">Haskell\/Traversable<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blog.plover.com\/prog\/haskell\/traversable.html\" rel=\"noopener noreferrer nofollow\">I struggle to understand Traversable<\/a> (Haskell)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"summary\" id=\"summary\"><\/a><\/p>\n<h2>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h2>\n<p>\u0414\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u043d\u0430\u0434. \u0412 \u0435\u0451 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u00ab\u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438\u00bb \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0445 \u043c\u043e\u043d\u0430\u0434 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u2014 <em>\u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b<\/em>. \u041e\u0431\u044b\u0447\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u0443\u044e, \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439.<\/p>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u043a\u043e\u043d\u043e\u0432 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Distributive[F[_]]<\/code> \u0441\u043d\u0430\u0431\u0436\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u00ab\u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443\u00bb \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, <code>Traversable[F[_]]<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u00ab\u043f\u0440\u043e\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u00bb \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u043c). \u041e\u0431\u0430 \u044d\u0442\u0438\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u043a\u043e\u043d\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041e\u0431\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u0430\u0432\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/536088\/?code=dc540f3d8ccdce2dd52fe97d96a85b0a&amp;state=ECBwfm3OeaYAG7jGzsD5exJi&amp;hl=ru\" rel=\"noopener noreferrer nofollow\">\u041f\u044b\u0442\u0430\u044f\u0441\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0435: \u043c\u043e\u043d\u0430\u0434\u044b<\/a> \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u043d\u0430\u0434 \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043e\u043f\u0440\u044f\u0436\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b <code>Free[F \u2218 G]<\/code>, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/1044512\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u0443\u044e \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443\u00bb \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>M[_]<\/code>, \u0438 \u043b\u0438\u0431\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0301\u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0440\u0430\u0441\u0442\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b, \u043b\u0438\u0431\u043e \u0436\u0435 \u0432\u0441\u0451 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442, \u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u00ab\u043d\u0435\u0447\u0435\u0441\u0442\u043d\u043e\u0439\u00bb \u043c\u043e\u043d\u0430\u0434\u043e\u0439, \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043a\u043e\u043d\u044b.<\/p>\n<p>\u0417\u0430\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043f\u0440\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u2014 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043c\u044b \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<\/div>\n<p>\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\/1055520\/\">https:\/\/habr.com\/ru\/articles\/1055520\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0427\u0430\u0441\u0442\u043d\u044b\u0439, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0437\u043e\u0440\u0430Hom-\u0442\u0438\u043f\u044b\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u041c\u043e\u043d\u0430\u0434\u044b\u041f\u0440\u0435\u0434\u0435\u043b\u044b \u0438 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u04325\u00bd.\u00a0\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u043d\u0430\u0434\u044b\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430\u0418\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u043e\u04327\u00bd. \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u04308.1. \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u04328.2. \u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u041c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044bDistributiveTraversable\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u00ab\u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438\u00bb:\u00ab\u0437\u0430\u0431\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439,\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u00ab\u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0433\u043e \u043f\u0443\u0442\u0438\u00bb \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439,\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445,\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445,\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u043d\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.\u042d\u0444\u0444\u0435\u043a\u0442\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a \u043d\u0435\u043c\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u00ab\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb.\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0424\u041f-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439\u00bb \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u00bb \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u0441 \u043d\u0435\u0439 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439\u00bb. \u0414\u0430, \u0432\u044b \u0438 \u0442\u0430\u043a \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u0437 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432 \u043c\u043e\u043d\u0430\u0434\u0443. \u041d\u043e \u043b\u044e\u0431\u043e\u0439 \u043b\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043c\u043e\u043d\u0430\u0434\u0443?\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c \u0432 \u043e\u0434\u0438\u043d, \u043f\u0440\u0438\u0447\u0451\u043c \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0431\u044b\u0442\u044c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438 \u00ab\u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0435\u0439 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u00bb. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 . \u0422\u043e\u0433\u0434\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a . \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb, s \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u043c\u043e\u043d\u043e\u0438\u0434\u043e\u043c. \u041d\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u043c\u043e\u043d\u043e\u0438\u0434\u0430\u043b\u0435\u043d \u2014 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f! \u042d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u0435 cats.Writer[S, A]. \u041d\u0435 \u0432\u0441\u044f\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u0434\u0430\u0436\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438.\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u043c\u043e\u043d\u0430\u0434  \u0438 , \u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440  \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043e\u0439. \u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0443\u0436\u0435 \u043a\u0430\u0441\u0430\u043b\u0438\u0441\u044c \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0442\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 , \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u043d\u0430\u0434 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438  \u0438  \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c! \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.\u0422\u0443\u0442 \u043d\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d \u043e\u0433\u043e\u0440\u0447\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0435\u0434\u0435\u0442\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439). \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0431\u0443\u0434\u0435\u043c \u043b\u0438 \u043c\u044b \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0438 \u043b\u0438\u0448\u044c \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0438\u0437 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043b\u0438 \u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u00bb \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432.\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0443 \u0434\u043b\u044f Writer[String] \u2218 List\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443:type Writer[S] = [A] =&gt;&gt; S \u00d7 A  type M = Writer[String] \u2218 List \/\/ [A] =&gt;&gt; (String, List[A])  def flatMap[A, B](fa: M[A])(f: A =&gt; M[B]): M[B] = {    val (log, list) = fa    val results = list.map(f) \/\/ List[(String, List[B])]    val combinedLog = results.foldLeft(log)(_ + _._1) \/\/ \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043d\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430!  val combinedValues = results.flatMap(_._2)    combinedLog -&gt; combinedValues  }\u0414\u043b\u044f \u0442\u0438\u043f\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043d\u043e\u0438\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430! \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f flatMap \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c:def f(x: Int): M[Int] = (s&#187; f($x) &#171;, List(x * 10))  def g(y: Int): M[Int] = (s&#187; g($y) &#171;, List(y * 10))    val m = (&#171;start&#187;, List(1, 2))    flatMap(flatMap(m)(     f  ))(g)  \/\/ (&#171;start f(1)  f(2)  g(10)  g(20) &#171;, List(100, 200))flatMap(m)(x =&gt; flatMap(f(x))(g)) \/\/ (&#171;start f(1)  g(10)  f(2)  g(20) &#171;, List(100, 200)) \/\/               \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f flatMap \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445.\u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e \u0441\u0445\u043e\u0436\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 List \u2218 List.\u041c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0435\u00bb (\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435) \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0418 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445.\u0418\u0434\u0435\u044f \u0442\u0430\u043a\u0430\u044f: \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u043e\u043d\u0430\u0434  \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 , \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b  \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 . \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 \u043f\u0440\u0435\u0434\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438: , \u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0434\u0430\u0451\u0442 \u043c\u043e\u043d\u0430\u0434\u0443.\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u043d\u0430\u0434  \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0441 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 . \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f Option:type OptionT[F[_]] = [A] =&gt;&gt; F[Option[A]]type Swap[F[_], G[_]] = (F \u2218 G) ~&gt; (G \u2218 F) \/\/ \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435given optionMonad: Monad[Option] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: Option[A]).map(f),    pure = [A] =&gt; (a: A) =&gt; Some(a),    flatten = [A] =&gt; (ooa: Option[Option[A]]) =&gt; ooa.flatten,  )\/\/ \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0434\u043b\u044f Option \u0441 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438given swapOptionT[F[_]: Monad as F]: Swap[Option, F] =    [A] =&gt; _.fold(F.pure(None))(F.fmap(optionMonad.pure[A]))\u0414\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b:given composeMonads: [F[_]: Monad as F, G[_]: Monad as G] =&gt; ((swap: Swap[G, F]) ?=&gt; Monad[F \u2218 G]) = (    fmap = compFunctor[F, G],    pure = [A] =&gt; (a: A) =&gt; F.pure(G.pure(a)), \/\/ F.pure \u2218 G.pure  flatten = [A] =&gt; (fgfga: F[G[F[G[A]]]]) =&gt; \/\/ (F.flatten \u2218 G.flatten) \u22c5 (id[F] \u2218 swap \u2218 id[G])    (F.fmap(G.flatten[A]) compose F.flatten[G[G[A]]] compose F.fmap(swap[G[A]]))(fgfga))\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 composeMonads \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u0443 \u0438\u0434\u0435\u044e \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041d\u043e \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0432\u0432\u0438\u0434\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043e\u043d \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.case class MonadTransformer[F[_]: Monad as F, G[_]: Monad as G, A](value: F[G[A]])(using swap: Swap[G, F]):    def flatMap[B](f: A =&gt; MonadTransformer[F, G, B]): MonadTransformer[F, G, B] =      MonadTransformer(value        .flatMap(F.fmap(G.flatten[B]) compose swap[G[B]] compose G.fmap(f andThen {_.value}))      )      def map[B](f: A =&gt; B): MonadTransformer[F, G, B] =      flatMap(f `andThen` G.pure[B] `andThen` F.pure[G[B]] `andThen` MonadTransformer.apply) end MonadTransformer  type MonadT[G[_]] = [F[_]] =&gt;&gt; [A] =&gt;&gt; MonadTransformer[F, G, A]\u041f\u0440\u0438\u043c\u0435\u0440 OptionT\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0432\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 OptionT \u0441 \u0431\u043b\u0435\u043a-\u0434\u0436\u0435\u043a\u043e\u043c \u0438\u2026type OptionT = MonadT[Option]\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b optionMonad: Monad[Option] \u0438 swapOptionT Swap[Option, F] \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u0443\u0435\u043c \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 OptionT[IO] \u2245 IO \u2218 Option:\/\/ \u043d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434\u044b \u0434\u043b\u044f \u00ab\u043a\u043e\u0448\u0430\u0447\u044c\u0435\u0433\u043e\u00bb IOgiven ioMonad: Monad[IO] = (    fmap = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: IO[A]).map(f),    pure = [A] =&gt; (a: A) =&gt; IO.pure(a), \/\/.pure(a),    flatten = [A] =&gt; (iia: IO[IO[A]]) =&gt; iia.flatten,  )  val findUserId:   UserName =&gt; OptionT[IO][UserId]      = _ =&gt; MonadTransformer(IO.pure(Some(42)))  val findCustomer: UserId   =&gt; OptionT[IO][Customer]    = _ =&gt; MonadTransformer(IO.pure(Some(&#171;\u043a\u0443\u0441\u0442\u043e\u043c\u0435\u0440&#187;)))  val findPhone:    Customer =&gt; OptionT[IO][PhoneNumber] = _ =&gt; MonadTransformer(IO.pure(Some(&#171;03&#187;)))val userPhone =    for      userId   &lt;- findUserId(&#171;\u042e\u0437\u0432\u0435\u0440\u044c&#187;)      customer &lt;- findCustomer(userId)      phone    &lt;- findPhone(customer)    yield phoneuserPhone.value.unsafeRunSync() \/\/ Some(03)\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 cats.data \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b:OptionT,EitherT,ReaderT,WriterT,StateT \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Scalaz \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 ListT, \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u044b \u043c\u043e\u043d\u0430\u0434\u044b. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f List \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u0440\u044b Cats \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c.\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0432\u0438\u0434\u0430type TotalEffect[A] = ReaderT[EitherT[StateT[IO, S, *], E, *], R, A]\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u00ab\u043c\u0438\u0440 TotalEffect\u00bb, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c \u043a\u043e\u0434\u043e\u043c.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Cats.MTL \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u2014 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435\u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u0430\u044f, \u0447\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u0443\u0436\u0435 \u043a \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u0430\u0436\u0435 \u0441 MTL \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0442\u044f\u0436\u0451\u043b\u044b\u043c\u0438: \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0443\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-486205","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/486205","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=486205"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/486205\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=486205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=486205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=486205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}