{"id":482688,"date":"2026-06-07T08:24:36","date_gmt":"2026-06-07T08:24:36","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482688"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482688","title":{"rendered":"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 7\u00bd. \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438. \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0443\u0434\u0435\u043b\u0435\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/1023452\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0439\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0421\u043f\u0435\u0440\u0432\u0430 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, (\u043a\u043e)\u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \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, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0438\u0445 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u0435. \u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0435\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u043e\u0438\u0441\u043a\u0435 \u043c\u043e\u043d\u0430\u0434\u044b, \u00ab\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u043e\u0439 \u043a \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443\u00bb. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (GADT). \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/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<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u043e\u0436\u0430\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 <\/p>\n<ul>\n<li>\n<p><a href=\"#kan\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#yoneda\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#codensity\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430<\/p>\n<ul>\n<li>\n<p><a href=\"#free\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#universal\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<ul>\n<li>\n<p><a href=\"#rec\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0432\u043e\u0434 \u0444\u043e\u0440\u043c\u0443\u043b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#fix\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gadt\" rel=\"noopener noreferrer nofollow\">GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#freer\" rel=\"noopener noreferrer nofollow\">\u0411\u043e\u043b\u0435\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 <code>Freer<\/code><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#libs\" rel=\"noopener noreferrer nofollow\">\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445<\/a><\/p>\n<\/li>\n<\/ul>\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=\"kan\" id=\"kan\"><\/a><\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430<\/h2>\n<h3>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430<\/h3>\n<p>\u0421\u0430\u043c\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 F \u0432\u0434\u043e\u043b\u044c G \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0434\u0435\u044e <em>\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439<\/em>. \u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 G \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u0430\u043b\u0430 \u00ab\u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 F\u00bb. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Functor[F[_]]<\/code> \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/1023452\/#kanimpl\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430<\/a>:<\/p>\n<pre><code class=\"scala\">given ranFunctor: [F[+_], G[+_]] =&gt; Functor[F \/ G] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: (F \/ G)[A]) =&gt;      [R] =&gt; (cont: B =&gt; G[R]) =&gt;        fga(cont `compose` f)        \/\/  \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191    given lanFunctor: [F[+_], G[+_]] =&gt; Functor[G \\ F] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: (G \\ F)[A]) =&gt;      [R] =&gt; (cont: [X] =&gt; (G[X] =&gt; B) \u00d7 F[X] =&gt; R) =&gt;        fga([X] =&gt; (gxaFx: (G[X] =&gt; A) \u00d7 F[X]) =&gt;          cont(f `compose` gxaFx._1, gxaFx._2))          \/\/   \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\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:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Lan}_GF\" alt=\"\\mathrm{Lan}_GF\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6f\/6f5\/6f5e2a3bca08ad4f7f839f222d50851c.svg\" width=\"48\" height=\"16\" data-width=\"6.943\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6f\/6f5\/6f5e2a3bca08ad4f7f839f222d50851c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6f\/6f5\/6f5e2a3bca08ad4f7f839f222d50851c.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u044d\u043a\u0437\u0438\u0441\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 (\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438) \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043e\u0431\u0435\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u043d\u043e\u0441\u0442\u044c <code>F[_]<\/code> \u0438 <code>G[_]<\/code>. \u00ab\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u0430\u044f\u00bb \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>f: A =&gt; B<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c, \u043b\u0438\u0431\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e. \u0422\u0430\u043a\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0438\u0446\u0430 \u0438 \u043a\u043e\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>identity<\/code>: <\/p>\n<pre><code class=\"scala\">def \u03b5Ran[F[+_], G[+_]]: (F \/ G) \u2218 G ~&gt; F =    [A] =&gt; ran =&gt; ran(identity[G[A]])  def \u03b7Lan[F[+_], G[+_]]: F ~&gt; ((G \\ F) \u2218 G) =    [A] =&gt; (fa: F[A]) =&gt;    [_] =&gt; cont =&gt; cont(identity[G[A]] -&gt; fa)<\/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\u0430\u043a\u0436\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c <img decoding=\"async\" class=\"formula inline\" source=\"(H, \\alpha)\" alt=\"(H, \\alpha)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/85a\/85aab7f0b6734528e6e0a73481d5a501.svg\" width=\"48\" height=\"16\" data-width=\"6.223\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/85a\/85aab7f0b6734528e6e0a73481d5a501.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/85a\/85aab7f0b6734528e6e0a73481d5a501.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0442\u0430\u043a\u0438\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0435\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:<\/p>\n<pre><code class=\"scala\">def uRan[F[+_], G[+_], H[+_]: Functor](\u03b1: H \u2218 G ~&gt; F): H ~&gt; (F \/ G) =    [A] =&gt; (ha: H[A]) =&gt;      [R] =&gt; (cont: A =&gt; G[R]) =&gt;        \u03b1(fmap[H](cont)(ha))    def uLan[F[+_], G[+_], H[+_]: Functor](\u03b1: F ~&gt; (H \u2218 G)): (G \\ F) ~&gt; H =    [A] =&gt; (lana: (G \\ F)[A]) =&gt; lana[H[A]](    [X] =&gt; gxaFx =&gt; fmap[H](gxaFx._1)(\u03b1(gxaFx._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><a class=\"anchor\" name=\"yoneda\" id=\"yoneda\"><\/a><\/p>\n<h3>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b<\/h3>\n<p>\u0412 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0443\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/1012402\/#yoneda\" rel=\"noopener noreferrer nofollow\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438\u0441\u044c<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043a\u0430\u043a \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u0432\u0434\u043e\u043b\u044c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Id.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u043e\u043d\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} Fa  \\\\ &amp;\\cong \\int^c Fc \\times \\mathrm{Hom}(c,a) &amp;&amp;\\equiv \u3088 F a \\\\ &amp;\\cong \\int_c \\mathrm{Hom}\\big(\\mathrm{Hom}(a,c), Fc \\big)  &amp;&amp;\\equiv \u3088^{op} F a. \\end{split}\" alt=\"\\begin{split} Fa  \\\\ &amp;\\cong \\int^c Fc \\times \\mathrm{Hom}(c,a) &amp;&amp;\\equiv \u3088 F a \\\\ &amp;\\cong \\int_c \\mathrm{Hom}\\big(\\mathrm{Hom}(a,c), Fc \\big)  &amp;&amp;\\equiv \u3088^{op} F a. \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcb\/dcb1e429418a2376bdef5d08e77746cb.svg\" width=\"312\" height=\"104\" data-width=\"39.223\" data-height=\"13.861\" data-vertical-align=\"-6.365\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcb\/dcb1e429418a2376bdef5d08e77746cb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcb\/dcb1e429418a2376bdef5d08e77746cb.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a31\/0c0\/58f\/a310c058fe59a7f6da961cb045ce7e43.png\" alt=\"\u041d\u0438\u043d\u0434\u0437\u044f!\" title=\"\u041d\u0438\u043d\u0434\u0437\u044f!\" width=\"800\" height=\"450\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a31\/0c0\/58f\/a310c058fe59a7f6da961cb045ce7e43.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a31\/0c0\/58f\/a310c058fe59a7f6da961cb045ce7e43.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0438\u043d\u0434\u0437\u044f!<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0446 \u0438 \u043a\u043e\u043a\u043e\u043d\u0435\u0446, \u044d\u0442\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0441 \u043f\u043e\u0434\u0430\u0447\u0438 \u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <em>\u043b\u0435\u043c\u043c \u043d\u0438\u043d\u0434\u0437\u044f \u0419\u043e\u043d\u0435\u0434\u044b<\/em>. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043b\u0435\u043c\u043c \u0419\u043e\u043d\u0435\u0434\u044b, \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u0448\u044c <em>\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435<\/em> \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0435\u0435\u043c <em>\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/em> \u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e (\u043a\u043e)\u043a\u043e\u043d\u0446\u043e\u0432.<\/p>\n<\/div>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b<\/p>\n<pre><code class=\"scala\">type Yoneda[F[+_]] = F \/ Id \/\/ [A] =&gt;&gt; [X] =&gt; (A =&gt; X) =&gt; F[X]<\/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>\u0432\u0435\u0442\u0432\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"(H, \\alpha)=(F, id_F)\" alt=\"(H, \\alpha)=(F, id_F)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9d2\/9d2d5d8069d2b3ddaeae99b3a65a2ada.svg\" width=\"136\" height=\"16\" data-width=\"17.044\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9d2\/9d2d5d8069d2b3ddaeae99b3a65a2ada.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9d2\/9d2d5d8069d2b3ddaeae99b3a65a2ada.svg 781w\" loading=\"lazy\" decode=\"async\"\/>:<\/p>\n<pre><code class=\"scala\">\/\/ \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\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  inline def id[F[+_]]: F ~&gt; F = [A] =&gt; identity[F[A]](_) \/\/ (fa: F[A]) =&gt; fa    def  liftYo[F[+_]: Functor]:        F  ~&gt; Yoneda[F] = uRan[F, Id, F](id)  def lowerYo[F[+_]         ]: Yoneda[F] ~&gt;        F  = \u03b5Ran[F, Id]\/\/  liftYo[F] \u22c5 lowerYo[F] = id[F]\/\/ lowerYo[F] \u22c5  liftYo[F] = id[Yoneda[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>\u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>F[_]<\/code>:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0419\u043e\u043d\u0435\u0434\u044b <code>Yoneda[F][_]<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0437 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u0438\u0434\u0430 <code>fmap[Yoneda[F]](f)<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a <code>F[_]<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c <code>F[_]<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u00ab\u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u0432 \u043c\u0438\u0440 \u0419\u043e\u043d\u0435\u0434\u044b\u00bb, \u043d\u043e \u043e\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438\u00bb. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>fmap[Yoneda[F]](f)<\/code> \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435, \u0430 <em>\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442 \u0441 \u043d\u0438\u043c<\/em> \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 <code>f<\/code> \u2014 \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 <code>fmap<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044e (fusion). \u0418 \u043b\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432 \u043d\u0435\u0433\u043e <code>fmap[F]<\/code>. \u0415\u0441\u043b\u0438 <code>F[_]<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u0442\u044f\u0436\u0451\u043b\u0443\u044e\u00bb \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0440\u043e\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430), \u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0419\u043e\u043d\u0435\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 <em>\u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437<\/em> \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u0412 \u044d\u0442\u043e\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u043b\u0430.<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0447\u0430\u0441\u0442\u043e. \u0412\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0419\u043e\u043d\u0435\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0437\u0430\u0442\u043e \u043e\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u041a\u0430\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0438\u043c\u0435\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<pre><code class=\"scala\">type Coyoneda[F[+_]] = Id \\ F    def  liftCoyo[F[+_]         ]:          F  ~&gt; Coyoneda[F] = \u03b7Lan[F, Id]  def lowerCoyo[F[+_]: Functor]: Coyoneda[F] ~&gt;          F  = uLan[F, Id, F](id)    \/\/  liftCoyo[F] \u22c5 lowerCoyo[F] = id[F]\/\/ lowerCoyo[F] \u22c5  liftCoyo[F] = id[Coyoneda[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>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0446\u0435\u043f\u043e\u0447\u0435\u043a <code>fmap<\/code>, \u043d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b, <code>liftCoyo<\/code> \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f <code>Functor[F]<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 <em>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e<\/em> <code>F[_]<\/code> \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430!<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0438 (\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043e\u0442 \u0435\u0451 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 (<code>lowerCoyo<\/code>). \u0418 \u0445\u043e\u0442\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>Functor[F]<\/code>, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u043d\u0451\u0432\u0440 \u043f\u0435\u0440\u0435\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <code>G[_]<\/code>. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438, \u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"codensity\" id=\"codensity\"><\/a><\/p>\n<h3>\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u041a\u0430\u043d\u0430, <a href=\"https:\/\/habr.com\/ru\/articles\/1012402\/#codencity\" rel=\"noopener noreferrer nofollow\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0435\u0435\u0441\u044f<\/a> \u0440\u0430\u043d\u0435\u0435 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435, \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432\u0434\u043e\u043b\u044c \u0441\u0435\u0431\u044f:<\/p>\n<pre><code class=\"scala\">type Codensity[F[+_]] = F \/ F \/\/ [a] =&gt;&gt; [x] =&gt; (a =&gt; F[x]) =&gt; F[x]<\/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\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <em>\u043c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438<\/em>:<\/p>\n<pre><code class=\"scala\">given codensityMonad: [F[+_]] =&gt; Monad[Codensity[F]] = (    fmap    = ranFunctor[F, F],    pure    = uRan[F, F, Id](id[F]),    flatten = uRan[F, F, (F \/ F) \u2218 (F \/ F)]( \/\/ \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 H = (F \/ F) \u2218 (F \/ F)    \u03b5Ran[F, F] \u22c5 (id[F\/F] \u2218 \u03b5Ran[F, F])    \/\/ \u03b1: H \u2218 F \u21dd F = \u03b5 \u22c5 (id_{F\/F} \u2218 \u03b5)  )(using compFunctor[F \/ F, F \/ F])      \/\/ \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432)<\/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\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 <code>compFunctor<\/code> <a href=\"https:\/\/habr.com\/ru\/articles\/933016\/#anyfunctor\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0430<\/a> \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"F\/F\" alt=\"F\/F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84f\/84fcb79c3f7362943316bbd8eb07f217.svg\" width=\"32\" height=\"16\" data-width=\"4.52\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84f\/84fcb79c3f7362943316bbd8eb07f217.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84f\/84fcb79c3f7362943316bbd8eb07f217.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043d\u043e \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0451 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c\u00bb \u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0438\/\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \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\"\/>. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u0438\u0437 <code>F[_]<\/code> \u0432 <code>Codensity[F][_]<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb <code>F<\/code>.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f <code>F[_]<\/code> \u0437\u0430\u043a\u043e\u043d\u043e\u043f\u043e\u0441\u043b\u0443\u0448\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c:<\/p>\n<pre><code class=\"scala\">def  liftCodens[F[+_]: Monad     ]: F ~&gt; Codensity[F] = [A] =&gt; (fa: F[A]) =&gt; [X] =&gt; fa.flatMap(_)  def lowerCodens[F[+_]: Monad as F]: Codensity[F] ~&gt; F = [A] =&gt; _(F.pure[A])\/\/  liftCodens[F] \u22c5 lowerCodens[F] = id[F]\/\/ lowerCodens[F] \u22c5  liftCodens[F] = id[Codensity[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>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c <em>\u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043c\u043e\u043d\u0430\u0434<\/em>, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0451 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 <code>fmap<\/code> \u0438 <code>flatten<\/code>. \u041f\u0435\u0440\u0432\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435 \u2014 \u043e\u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0432 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u2014 \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u0431\u044b \u00ab\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c <code>flatten<\/code>\u00bb, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0439\u00bb, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u043d\u0438\u044e \u0442\u044f\u0436\u0451\u043b\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>F[_]<\/code> \u00ab\u0432 \u0448\u0438\u0440\u0438\u043d\u0443\u00bb, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\u00bb \u0431\u0435\u0437 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0439\u00bb) \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439.<\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0430\u043b\u0433\u0435\u0431\u0440).<\/p>\n<p><a class=\"anchor\" name=\"free\" id=\"free\"><\/a><\/p>\n<h2>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430<\/h2>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u044e\u0431\u043e\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\"\/>, \u043d\u043e \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\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\"\/>. \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430?<\/p>\n<p>\u0421\u0430\u043c\u0443 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435 \u0442\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0430\u00bb \u0438 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb), \u0442\u0430\u043a \u043e\u043d\u0438 \u0435\u0449\u0451 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u0435 \u0432\u0441\u044f\u043a\u0438\u0439 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043d\u0430\u0431\u0434\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u043d\u043e\u043c\u0443 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u043d\u0430\u0434\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"(T, \\eta, \\mu)\" alt=\"(T, \\eta, \\mu)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg\" width=\"56\" height=\"16\" data-width=\"7.854\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u00ab\u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e\u00bb \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"T\\colon \\mathcal{C} \\to \\mathcal{C}\" alt=\"T\\colon \\mathcal{C} \\to \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f23\/f238c3ad261a05eb947a4ecbb8e1b56b.svg\" width=\"64\" height=\"16\" data-width=\"8.503\" 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\/f23\/f238c3ad261a05eb947a4ecbb8e1b56b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f23\/f238c3ad261a05eb947a4ecbb8e1b56b.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c <img decoding=\"async\" class=\"formula inline\" source=\"F\\colon \\mathcal{C} \\to \\mathcal{C}\" alt=\"F\\colon \\mathcal{C} \\to \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ec3\/ec323612fd77e7dccfbaf22a3944b944.svg\" width=\"64\" height=\"16\" data-width=\"8.605\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ec3\/ec323612fd77e7dccfbaf22a3944b944.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ec3\/ec323612fd77e7dccfbaf22a3944b944.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u0430\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"lift\\colon F \\rightsquigarrow T\" alt=\"lift\\colon F \\rightsquigarrow T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg\" width=\"88\" height=\"16\" data-width=\"11.329\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"a \\to Fb\" alt=\"a \\to Fb\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/129\/129a6f03bf11718c4eb4450265ba1d0c.svg\" width=\"56\" height=\"16\" data-width=\"7.381\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/129\/129a6f03bf11718c4eb4450265ba1d0c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/129\/129a6f03bf11718c4eb4450265ba1d0c.svg 781w\" loading=\"lazy\" decode=\"async\"\/>  \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"a \\to Tb\" alt=\"a \\to Tb\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/89\/893\/8935bc9f34e46a32350a8eb56060e0bb.svg\" width=\"56\" height=\"16\" data-width=\"7.28\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/89\/893\/8935bc9f34e46a32350a8eb56060e0bb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/89\/893\/8935bc9f34e46a32350a8eb56060e0bb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u0443\u0436\u0435 \u0442\u0430\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u043d\u0430\u0434\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0451 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0443\u044e <strong>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443<\/strong>. \u0415\u0451 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<blockquote>\n<p>\u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 <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\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"(T, \\eta, \\mu)\" alt=\"(T, \\eta, \\mu)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg\" width=\"56\" height=\"16\" data-width=\"7.854\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f6c\/f6c563581797819ed744df844709d4cb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <img decoding=\"async\" class=\"formula inline\" source=\"lift\\colon F \\rightsquigarrow T\" alt=\"lift\\colon F \\rightsquigarrow T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg\" width=\"88\" height=\"16\" data-width=\"11.329\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3f5\/3f5e0e310aa7463f34ce4403b37f642f.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha\\colon F \\rightsquigarrow M\" alt=\"\\alpha\\colon F \\rightsquigarrow M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c4\/c48\/c48e2f44daf8a3ccc562a2f7e399ab73.svg\" width=\"80\" height=\"16\" data-width=\"10.046\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c4\/c48\/c48e2f44daf8a3ccc562a2f7e399ab73.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c4\/c48\/c48e2f44daf8a3ccc562a2f7e399ab73.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u043b\u044e\u0431\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"M\" alt=\"M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/69\/696\/69691c7bdcc3ce6d5d8a1361f22d04ac.svg\" width=\"16\" height=\"12\" data-width=\"2.378\" data-height=\"1.545\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/69\/696\/69691c7bdcc3ce6d5d8a1361f22d04ac.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/69\/696\/69691c7bdcc3ce6d5d8a1361f22d04ac.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 (\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439) \u043c\u043e\u0440\u0444\u0438\u0437\u043c <img decoding=\"async\" class=\"formula inline\" source=\"u\\colon T \\rightsquigarrow M\" alt=\"u\\colon T \\rightsquigarrow M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ede\/edeefc7162e0d986b433335eacb1dbe9.svg\" width=\"72\" height=\"16\" data-width=\"9.79\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ede\/edeefc7162e0d986b433335eacb1dbe9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ede\/edeefc7162e0d986b433335eacb1dbe9.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0442\u0430\u043a\u043e\u0439 \u0447\u0442\u043e <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha = u \\cdot lift\" alt=\"\\alpha = u \\cdot lift\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c1\/c1c\/c1cfdbc50a129328d3d6e67ef9d6eddb.svg\" width=\"80\" height=\"16\" data-width=\"10.91\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c1\/c1c\/c1cfdbc50a129328d3d6e67ef9d6eddb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c1\/c1c\/c1cfdbc50a129328d3d6e67ef9d6eddb.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<\/blockquote>\n<p><a class=\"anchor\" name=\"universal\" id=\"universal\"><\/a><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1007932\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u043d\u0435\u0435<\/a> \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u043b\u044e\u0431\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443 <img decoding=\"async\" class=\"formula inline\" source=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg\" width=\"12\" height=\"12\" data-width=\"1.593\" data-height=\"1.532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u043e\u043f\u0440\u044f\u0436\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"T = U \\circ \\tilde F = U \\circ (Id\/U) \\cong U\/U= \\mathrm{Codens}\\, U,\" alt=\"T = U \\circ \\tilde F = U \\circ (Id\/U) \\cong U\/U= \\mathrm{Codens}\\, U,\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/177\/177608b4f247bbe5ece1cc39067a4fd2.svg\" width=\"352\" height=\"16\" data-width=\"44.564\" data-height=\"2.801\" data-vertical-align=\"-0.835\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/177\/177608b4f247bbe5ece1cc39067a4fd2.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/177\/177608b4f247bbe5ece1cc39067a4fd2.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\tilde F = Id\/U \\dashv U\" alt=\"\\tilde F = Id\/U \\dashv U\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f3\/f39\/f39b4d19b19a8cad3080881ac69dc55f.svg\" width=\"112\" height=\"16\" data-width=\"14.269\" data-height=\"2.801\" data-vertical-align=\"-0.835\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f3\/f39\/f39b4d19b19a8cad3080881ac69dc55f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f3\/f39\/f39b4d19b19a8cad3080881ac69dc55f.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 <em>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439<\/em> \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043b\u044f <em>\u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"U\" alt=\"U\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c6\/4c614360da93c0a041b22e537de151eb.svg\" width=\"12\" height=\"12\" data-width=\"1.735\" data-height=\"1.595\" data-vertical-align=\"-0.05\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c6\/4c614360da93c0a041b22e537de151eb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c6\/4c614360da93c0a041b22e537de151eb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u0418, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043c\u043e\u043d\u0430\u0434 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Mon}(\\mathcal{C}) \" alt=\"\\mathrm{Mon}(\\mathcal{C}) \" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3d\/c3da71bdd43eaf917570bf8033c73210.svg\" width=\"56\" height=\"16\" data-width=\"7.416\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3d\/c3da71bdd43eaf917570bf8033c73210.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3d\/c3da71bdd43eaf917570bf8033c73210.svg 781w\" loading=\"lazy\" decode=\"async\"\/>\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"(M,\\eta,\\mu)\" alt=\"(M,\\eta,\\mu)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/180\/180a5e0bee4ca355b95d065f246a0fa2.svg\" width=\"64\" height=\"16\" data-width=\"8.639\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/180\/180a5e0bee4ca355b95d065f246a0fa2.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/180\/180a5e0bee4ca355b95d065f246a0fa2.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c <img decoding=\"async\" class=\"formula inline\" source=\"U_M: \\mathrm{Mon}(\\mathcal{C}) \\to \\mathrm{Endo}(\\mathcal{C})\" alt=\"U_M: \\mathrm{Mon}(\\mathcal{C}) \\to \\mathrm{Endo}(\\mathcal{C})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/20\/20a\/20aef67ffe31d8d3ce1687ac9b95c8e9.svg\" width=\"192\" height=\"16\" data-width=\"24.376\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/20\/20a\/20aef67ffe31d8d3ce1687ac9b95c8e9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/20\/20a\/20aef67ffe31d8d3ce1687ac9b95c8e9.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Endo}(\\mathcal{C})=\\mathcal{C}^\\mathcal{C}\" alt=\"\\mathrm{Endo}(\\mathcal{C})=\\mathcal{C}^\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a920e1a8bd963158e6b841336ea8c68.svg\" width=\"104\" height=\"16\" data-width=\"13.381\" data-height=\"2.628\" data-vertical-align=\"-0.748\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a920e1a8bd963158e6b841336ea8c68.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a920e1a8bd963158e6b841336ea8c68.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"U_M(M,\\eta,\\mu) = M\" alt=\"U_M(M,\\eta,\\mu) = M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db1\/db105a8471596b9d44eaa1ee67a3ddab.svg\" width=\"136\" height=\"16\" data-width=\"17.448\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db1\/db105a8471596b9d44eaa1ee67a3ddab.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db1\/db105a8471596b9d44eaa1ee67a3ddab.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a\u043e\u0439 <em>\u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/em>: <\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} &amp;\\mathrm{Free} \\colon \\mathrm{Endo}\\big(\\mathcal{C}\\big) \\to \\mathrm{Endo}(\\mathcal{C}) = \\mathrm{Codens}\\, U_M, \\\\ &amp;\\mathrm{Free}\\, F\\, a = \\int_{(M,\\eta,\\mu):\\,\\mathrm{Mon}(\\mathcal{C})} \\big(F \\rightsquigarrow M\\big) \\to M a. \\end{split}\" alt=\"\\begin{split} &amp;\\mathrm{Free} \\colon \\mathrm{Endo}\\big(\\mathcal{C}\\big) \\to \\mathrm{Endo}(\\mathcal{C}) = \\mathrm{Codens}\\, U_M, \\\\ &amp;\\mathrm{Free}\\, F\\, a = \\int_{(M,\\eta,\\mu):\\,\\mathrm{Mon}(\\mathcal{C})} \\big(F \\rightsquigarrow M\\big) \\to M a. \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e2\/e2c\/e2c58c30523205c0448d47a39a09566e.svg\" width=\"328\" height=\"64\" data-width=\"41.889\" data-height=\"8.898\" data-vertical-align=\"-3.884\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e2\/e2c\/e2c58c30523205c0448d47a39a09566e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e2\/e2c\/e2c58c30523205c0448d47a39a09566e.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043d\u0438 \u0447\u0442\u043e \u0438\u043d\u043e\u0435, \u043a\u0430\u043a \u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b. \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0435\u0446 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"scala\">type FreeU[F[_]] = [X] =&gt;&gt; [M[_]] =&gt; Monad[M] ?=&gt; (F ~&gt; M) =&gt; M[X]    given freeUFunctor: [F[_]] =&gt; Functor[FreeU[F]] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fa: FreeU[F][A]) =&gt;      [M[_]] =&gt; (M: Monad[M]) ?=&gt; (interpreter: F ~&gt; M) =&gt;        fa(interpreter).map(f)    given freeUMonad: [F[_]] =&gt; Monad[FreeU[F]] = (    fmap    = freeUFunctor,    pure    = [A] =&gt; (a: A) =&gt; [M[_]] =&gt; (M: Monad[M]) ?=&gt; (_: F ~&gt; M) =&gt; M.pure(a),    flatten = [A] =&gt; (ffa: FreeU[F][FreeU[F][A]]) =&gt;      [M[_]] =&gt; (M: Monad[M]) ?=&gt; (interpreter: F ~&gt; M) =&gt;        ffa(interpreter).flatMap(_(interpreter))  )    def liftFreeU[F[_]]: F ~&gt; FreeU[F] =    [A] =&gt; (fa: F[A]) =&gt;      [M[_]] =&gt; (_: Monad[M]) ?=&gt; (interpreter: F ~&gt; M) =&gt;        interpreter(fa)    inline def foldMapU[F[_], M[_]: Monad as M]: (F ~&gt; M) =&gt; (FreeU[F] ~&gt; M) =    interpreter =&gt; [A] =&gt; (fa: FreeU[F][A]) =&gt; fa(interpreter)<\/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>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0438\u0441\u0442\u0438\u043d\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443:<\/p>\n<ul>\n<li>\n<p>\u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0447\u0438\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0448\u0430\u0433\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 <code>Functor[F]<\/code> \u2014 \u043e\u043d\u0430 \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>interpreter: F ~&gt; M<\/code>, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0435\u0433\u043e \u00ab\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0436\u0435 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b, \u043e\u043f\u0438\u0440\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.<\/p>\n<p><a class=\"anchor\" name=\"rec\" id=\"rec\"><\/a><\/p>\n<h3>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<h4>\u0412\u044b\u0432\u043e\u0434 \u0444\u043e\u0440\u043c\u0443\u043b<\/h4>\n<p>\u0420\u043e\u0434\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 <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=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg\" width=\"12\" height=\"12\" data-width=\"1.593\" data-height=\"1.532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043b\u0435\u0433\u0447\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \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: <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Hom}\\, (F, M) \\cong \\mathrm{Hom}\\, (T, M)\" alt=\"\\mathrm{Hom}\\, (F, M) \\cong \\mathrm{Hom}\\, (T, M)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/98\/98d\/98d417fe104130a72ace930a2596c2c0.svg\" width=\"208\" height=\"16\" data-width=\"26.774\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/98\/98d\/98d417fe104130a72ace930a2596c2c0.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/98\/98d\/98d417fe104130a72ace930a2596c2c0.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041d\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430, \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0433\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e M, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 <em>\u0430\u043b\u0433\u0435\u0431\u0440 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430<\/em> \u0438 <em>\u0430\u043b\u0433\u0435\u0431\u0440 \u043c\u043e\u043d\u0430\u0434\u044b<\/em>:<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \\mathcal{Alg}_F \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f F-\u0430\u043b\u0433\u0435\u0431\u0440, \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043f\u0430\u0440\u044b (a, \\alpha), \u0433\u0434\u0435 \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430\u00bb \\alpha: Fa \\to a \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u0435\u0442\u0441\u044f \u0441 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \\mathcal{Alg}_T \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0430\u043b\u0433\u0435\u0431\u0440 \u042d\u0439\u043b\u0435\u043d\u0431\u0435\u0440\u0433\u0430-\u041c\u0443\u0440\u0430 \u043c\u043e\u043d\u0430\u0434\u044b T (\u0441\u043c. <a href=\"https:\/\/habr.com\/ru\/articles\/1007932\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/a> \u043e\u0431\u0437\u043e\u0440\u0430). \u041f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e a\u043b\u0433\u0435\u0431\u0440\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0432\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430\u043a\u043e\u043d\u0430\u043c \u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\mathcal{Alg}_F \\cong \\mathcal{Alg}_T.\" alt=\"\\mathcal{Alg}_F \\cong \\mathcal{Alg}_T.\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1f\/1fb\/1fb22b291bce5e51e2b3e3f8717f5ff3.svg\" width=\"104\" height=\"16\" data-width=\"13.464\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1f\/1fb\/1fb22b291bce5e51e2b3e3f8717f5ff3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1f\/1fb\/1fb22b291bce5e51e2b3e3f8717f5ff3.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0430\u043b\u0433\u0435\u0431\u0440 \u042d\u0439\u043b\u0435\u043d\u0431\u0435\u0440\u0433\u0430-\u041c\u0443\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{Alg}_T\" alt=\"\\mathcal{Alg}_T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bd\/bdd\/bddfb1ac70311e3e78fc7f71a1146596.svg\" width=\"32\" height=\"16\" data-width=\"4.873\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bd\/bdd\/bddfb1ac70311e3e78fc7f71a1146596.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bd\/bdd\/bddfb1ac70311e3e78fc7f71a1146596.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0435\u0435 \u043c\u043e\u043d\u0430\u0434\u0443. \u0418 \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0430\u043b\u0433\u0435\u0431\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg\" width=\"12\" height=\"12\" data-width=\"1.593\" data-height=\"1.532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"U_F\\colon \\mathcal{Alg}_F \\to \\mathcal{C}\" alt=\"U_F\\colon \\mathcal{Alg}_F \\to \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ecb\/ecba6a2231b9bb4bd16a0776bf9971ee.svg\" width=\"104\" height=\"16\" data-width=\"13.594\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ecb\/ecba6a2231b9bb4bd16a0776bf9971ee.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ec\/ecb\/ecba6a2231b9bb4bd16a0776bf9971ee.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0430\u043b\u0433\u0435\u0431\u0440: <img decoding=\"async\" class=\"formula inline\" source=\"T = \\mathrm{Codens}\\,U_F\" alt=\"T = \\mathrm{Codens}\\,U_F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/67\/678\/678260de5fad498caac50ff0ec7ffb8b.svg\" width=\"120\" height=\"16\" data-width=\"15.095\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/67\/678\/678260de5fad498caac50ff0ec7ffb8b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/67\/678\/678260de5fad498caac50ff0ec7ffb8b.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0439\u0434\u0451\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432 \u0442\u043e\u0447\u043a\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"x: \\mathcal{C}\" alt=\"x: \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e9\/1e94a3bf62c5fcadc184b8e38e45e374.svg\" width=\"32\" height=\"16\" data-width=\"4.372\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e9\/1e94a3bf62c5fcadc184b8e38e45e374.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e9\/1e94a3bf62c5fcadc184b8e38e45e374.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u043e\u0432. \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/1023452\/#kanimpl\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043e\u0431\u0437\u043e\u0440\u0430 \u044f\u0432\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0446\u0430 \u0438 \u0443\u0447\u0442\u0451\u043c, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0430\u043b\u0433\u0435\u0431\u0440 \u043a\u0430\u043a <img decoding=\"async\" class=\"formula inline\" source=\"U_F(a,\\alpha)=a\" alt=\"U_F(a,\\alpha)=a\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5a\/5ad\/5adad7c58259c43170f77219a6472b9e.svg\" width=\"96\" height=\"16\" data-width=\"12.556\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5a\/5ad\/5adad7c58259c43170f77219a6472b9e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5a\/5ad\/5adad7c58259c43170f77219a6472b9e.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0435\u0446 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0430\u043b\u0433\u0435\u0431\u0440, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} T\\, x &amp;\\cong\\int_{(a, \\alpha)\\colon \\mathcal{Alg}_F} \\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big) \\\\ &amp;\\cong \\int_{(a, \\alpha)}\\int_{f: \\mathrm{Hom}(x, a)} a \\cong \\int_{\\big((a, \\alpha), f\\big):\\, x \\downarrow U_F} a. \\end{split}\" alt=\"\\begin{split} T\\, x &amp;\\cong\\int_{(a, \\alpha)\\colon \\mathcal{Alg}_F} \\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big) \\\\ &amp;\\cong \\int_{(a, \\alpha)}\\int_{f: \\mathrm{Hom}(x, a)} a \\cong \\int_{\\big((a, \\alpha), f\\big):\\, x \\downarrow U_F} a. \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5d\/c5de9564c3737182d7422f829882d608.svg\" width=\"320\" height=\"88\" data-width=\"40.417\" data-height=\"11.852\" data-vertical-align=\"-5.36\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5d\/c5de9564c3737182d7422f829882d608.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c5\/c5d\/c5de9564c3737182d7422f829882d608.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u043f\u043e\u0434 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0446 \u0432 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"f: \\mathrm{Hom}(x, a)\" alt=\"f: \\mathrm{Hom}(x, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799cf8052bbabacf745e1c865b6c6b2e.svg\" width=\"104\" height=\"16\" data-width=\"13.1\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799cf8052bbabacf745e1c865b6c6b2e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799cf8052bbabacf745e1c865b6c6b2e.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b\u0438 \u0434\u0432\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"x \\downarrow U_F\" alt=\"x \\downarrow U_F\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bf\/bf6\/bf6edc33ab27d60326e0a9557c9cae80.svg\" width=\"48\" height=\"16\" data-width=\"6.614\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bf\/bf6\/bf6edc33ab27d60326e0a9557c9cae80.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bf\/bf6\/bf6edc33ab27d60326e0a9557c9cae80.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\big((a, \\alpha), f\\big)\" alt=\"\\big((a, \\alpha), f\\big)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed2\/ed240ea68e64af02797e17bdfed4a0cf.svg\" width=\"72\" height=\"16\" data-width=\"9.734\" data-height=\"2.713\" data-vertical-align=\"-0.791\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed2\/ed240ea68e64af02797e17bdfed4a0cf.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed2\/ed240ea68e64af02797e17bdfed4a0cf.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0430\u043b\u0433\u0435\u0431\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{Alg}_{\\dot F}\" alt=\"\\mathcal{Alg}_{\\dot F}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/68\/685\/68526da2f4d0dfe367eeca9bc9dc5c7f.svg\" width=\"32\" height=\"16\" data-width=\"4.945\" data-height=\"2.505\" data-vertical-align=\"-0.687\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/68\/685\/68526da2f4d0dfe367eeca9bc9dc5c7f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/68\/685\/68526da2f4d0dfe367eeca9bc9dc5c7f.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\dot F_x\\, a = x + Fa\" alt=\"\\dot F_x\\, a = x + Fa\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg\" width=\"112\" height=\"16\" data-width=\"14.101\" data-height=\"2.839\" data-vertical-align=\"-0.854\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\big(a, (f, \\alpha)\\colon x + Fa \\to a\\big)\" alt=\"\\big(a, (f, \\alpha)\\colon x + Fa \\to a\\big)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fd\/fdd\/fddd6a8cca4f6ca8932c39e233aa8f7b.svg\" width=\"176\" height=\"16\" data-width=\"22.407\" data-height=\"2.713\" data-vertical-align=\"-0.791\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fd\/fdd\/fddd6a8cca4f6ca8932c39e233aa8f7b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fd\/fdd\/fddd6a8cca4f6ca8932c39e233aa8f7b.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u0443 \u043d\u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0446 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\dot F_x\" alt=\"\\dot F_x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f63\/f632bf0f71e0fc2198171e7a27c628ce.svg\" width=\"16\" height=\"16\" data-width=\"2.558\" data-height=\"2.839\" data-vertical-align=\"-0.854\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f63\/f632bf0f71e0fc2198171e7a27c628ce.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f6\/f63\/f632bf0f71e0fc2198171e7a27c628ce.svg 781w\" loading=\"lazy\" decode=\"async\"\/>-\u0430\u043b\u0433\u0435\u0431\u0440. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"U_{\\dot F_x}\" alt=\"U_{\\dot F_x}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg\" width=\"24\" height=\"16\" data-width=\"3.542\" data-height=\"2.757\" data-vertical-align=\"-0.813\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0437\u0430 \u0437\u043d\u0430\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"T\\, x \\cong \\int_{b\\colon\\, \\mathcal{Alg}_{\\dot F_x}} U_{\\dot F_x} b  \\cong U_{\\dot F_x}\\int_{b\\colon\\, \\mathcal{Alg}_{\\dot F_x}} b  \\cong U_{\\dot F_x}\\lim_{\\mathcal{Alg}_{\\dot F_x}} Id.\" alt=\"T\\, x \\cong \\int_{b\\colon\\, \\mathcal{Alg}_{\\dot F_x}} U_{\\dot F_x} b  \\cong U_{\\dot F_x}\\int_{b\\colon\\, \\mathcal{Alg}_{\\dot F_x}} b  \\cong U_{\\dot F_x}\\lim_{\\mathcal{Alg}_{\\dot F_x}} Id.\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/16\/16f\/16f200f2b5265fa2c88951c72ba0f9b4.svg\" width=\"376\" height=\"40\" data-width=\"47.975\" data-height=\"5.86\" data-vertical-align=\"-2.365\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/16\/16f\/16f200f2b5265fa2c88951c72ba0f9b4.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/16\/16f\/16f200f2b5265fa2c88951c72ba0f9b4.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041a\u0430\u043a <a href=\"https:\/\/habr.com\/ru\/articles\/970762\/#limitsProg\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e<\/a>, \u043f\u0440\u0435\u0434\u0435\u043b \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0434\u0430\u0451\u0442 <em>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/em> \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <em>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"(i_x, \\alpha_{i_x}\\colon \\dot F_x i_x \\to i_x)\" alt=\"(i_x, \\alpha_{i_x}\\colon \\dot F_x i_x \\to i_x)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/eda\/eda3257f764ae7564b3c92fedb359d76.svg\" width=\"144\" height=\"16\" data-width=\"18.467\" data-height=\"2.866\" data-vertical-align=\"-0.867\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/eda\/eda3257f764ae7564b3c92fedb359d76.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/eda\/eda3257f764ae7564b3c92fedb359d76.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"U_{\\dot F_x}\" alt=\"U_{\\dot F_x}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg\" width=\"24\" height=\"16\" data-width=\"3.542\" data-height=\"2.757\" data-vertical-align=\"-0.813\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c1\/3c14ec50be677072d820f9c8a0014ecb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0451 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c <img decoding=\"async\" class=\"formula inline\" source=\"i_x\" alt=\"i_x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e3f\/e3f21d4067454ed4fd433a852420d048.svg\" width=\"12\" height=\"12\" data-width=\"1.883\" data-height=\"1.852\" data-vertical-align=\"-0.357\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e3f\/e3f21d4067454ed4fd433a852420d048.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e3f\/e3f21d4067454ed4fd433a852420d048.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e<\/p>\n<blockquote>\n<p>\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0434\u043b\u044f <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\"\/> \u0432 \u0442\u043e\u0447\u043a\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"x\" alt=\"x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg\" width=\"12\" height=\"12\" data-width=\"1.294\" data-height=\"1.025\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u044d\u0442\u043e \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\dot F_x\\, a = x + Fa\" alt=\"\\dot F_x\\, a = x + Fa\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg\" width=\"112\" height=\"16\" data-width=\"14.101\" data-height=\"2.839\" data-vertical-align=\"-0.854\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/35\/352\/352453c10adba31a2d9bac6aa3d212de.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<\/blockquote>\n<p>\u0412\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b <img decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg\" width=\"12\" height=\"12\" data-width=\"0.781\" data-height=\"1.52\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u044d\u043d\u0434\u043e\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\"\/> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430: <img decoding=\"async\" class=\"formula inline\" source=\"Gi \\cong i\" alt=\"Gi \\cong i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/19\/191\/1914e16c9cdeb62d8561848b368fef0a.svg\" width=\"48\" height=\"16\" data-width=\"6.356\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/19\/191\/1914e16c9cdeb62d8561848b368fef0a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/19\/191\/1914e16c9cdeb62d8561848b368fef0a.svg 781w\" loading=\"lazy\" decode=\"async\"\/> (\u0432\u043f\u0440\u0430\u0432\u043e \u0432\u0435\u0434\u0451\u0442 \u0430\u043b\u0433\u0435\u0431\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha_i\\colon Gi \\to i\" alt=\"\\alpha_i\\colon Gi \\to i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/02\/023\/023ca6ec6fae451ba28213850752816c.svg\" width=\"80\" height=\"16\" data-width=\"10.052\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/02\/023\/023ca6ec6fae451ba28213850752816c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/02\/023\/023ca6ec6fae451ba28213850752816c.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0432\u043b\u0435\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430). \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg\" width=\"12\" height=\"12\" data-width=\"0.781\" data-height=\"1.52\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/865\/865c0c0b4ab0e063e5caa3387c1a8741.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"G\\colon \\mathcal{C} \\to \\mathcal{C}\" alt=\"G\\colon \\mathcal{C} \\to \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17d3aefb31c984b11ed297cb7075c61a.svg\" width=\"64\" height=\"16\" data-width=\"8.688\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17d3aefb31c984b11ed297cb7075c61a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17d3aefb31c984b11ed297cb7075c61a.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"\\mu\\colon \\mathcal{C}^\\mathcal{C} \\to \\mathcal{C}\" alt=\"\\mu\\colon \\mathcal{C}^\\mathcal{C} \\to \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ce\/ce5\/ce54c647f8979da80cfb04788922015b.svg\" width=\"72\" height=\"16\" data-width=\"9.305\" data-height=\"2.628\" data-vertical-align=\"-0.748\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ce\/ce5\/ce54c647f8979da80cfb04788922015b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ce\/ce5\/ce54c647f8979da80cfb04788922015b.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0447\u0442\u043e <img decoding=\"async\" class=\"formula inline\" source=\"\\mu G = i\" alt=\"\\mu G = i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/32\/323\/32380e754f9235af94e86b05d6fa9df4.svg\" width=\"48\" height=\"16\" data-width=\"6.94\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/32\/323\/32380e754f9235af94e86b05d6fa9df4.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/32\/323\/32380e754f9235af94e86b05d6fa9df4.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0432 \u0442\u043e\u0447\u043a\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"x\" alt=\"x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg\" width=\"12\" height=\"12\" data-width=\"1.294\" data-height=\"1.025\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9d\/9dd\/9dd4e461268c8034f5c8564e155c67a6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} T x &amp;=\\mu \\dot F_x \\\\ &amp;= x + F (T x). \\end{split}\" alt=\"\\begin{split} T x &amp;=\\mu \\dot F_x \\\\ &amp;= x + F (T x). \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/05\/053\/053d94c631e217078491bd61124aab5f.svg\" width=\"128\" height=\"40\" data-width=\"16.934\" data-height=\"5.781\" data-vertical-align=\"-2.325\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/05\/053\/053d94c631e217078491bd61124aab5f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/05\/053\/053d94c631e217078491bd61124aab5f.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u0438 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u0434\u0430\u044e\u0442 \u0435\u0449\u0451 \u0434\u0432\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p><a class=\"anchor\" name=\"fix\" id=\"fix\"><\/a><\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0446 \u0434\u043b\u044f \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} T x &amp;= \\mu \\dot F_x \\\\ &amp;\\cong\\int_{(a, \\alpha)\\colon \\mathcal{Alg}_F} \\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big) \\\\ &amp;\\cong \\int_{a}\\mathrm{Hom}\\Big(\\mathrm{Hom}(Fa, a),\\,\\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big)\\Big) \\\\ &amp;\\cong \\int_{a}\\mathrm{Hom}\\big(\\mathrm{Hom}(\\dot F_x a, a),\\, a \\big). \\end{split}\" alt=\"\\begin{split} T x &amp;= \\mu \\dot F_x \\\\ &amp;\\cong\\int_{(a, \\alpha)\\colon \\mathcal{Alg}_F} \\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big) \\\\ &amp;\\cong \\int_{a}\\mathrm{Hom}\\Big(\\mathrm{Hom}(Fa, a),\\,\\mathrm{Hom}\\big(\\mathrm{Hom}(x, a), a\\big)\\Big) \\\\ &amp;\\cong \\int_{a}\\mathrm{Hom}\\big(\\mathrm{Hom}(\\dot F_x a, a),\\, a \\big). \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa0\/aa0874db7dab75e4e69d5f959b7ce4ce.svg\" width=\"376\" height=\"160\" data-width=\"47.896\" data-height=\"20.629\" data-vertical-align=\"-9.749\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa0\/aa0874db7dab75e4e69d5f959b7ce4ce.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa0\/aa0874db7dab75e4e69d5f959b7ce4ce.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043f\u0435\u0440\u0432\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0435\u0446 \u043f\u043e <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha\\colon \\mathrm{Hom}(Fa, a)\" alt=\"\\alpha\\colon \\mathrm{Hom}(Fa, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/868\/8686d28864870d87f5feb7054bb5c1c0.svg\" width=\"112\" height=\"16\" data-width=\"14.021\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/868\/8686d28864870d87f5feb7054bb5c1c0.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/86\/868\/8686d28864870d87f5feb7054bb5c1c0.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Hom}\" alt=\"\\mathrm{Hom}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/46\/468\/4683eb0f634c7bb7030dd3566c8b3896.svg\" width=\"32\" height=\"16\" data-width=\"4.713\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/46\/468\/4683eb0f634c7bb7030dd3566c8b3896.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/46\/468\/4683eb0f634c7bb7030dd3566c8b3896.svg 781w\" loading=\"lazy\" decode=\"async\"\/>), \u0430 \u0437\u0430\u0442\u0435\u043c \u0447\u0438\u0441\u0442\u043e \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0412\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\mu G = \\int_a\\mathrm{Hom}\\big(\\mathrm{Hom}(G a, a),\\, a \\big).\" alt=\"\\mu G = \\int_a\\mathrm{Hom}\\big(\\mathrm{Hom}(G a, a),\\, a \\big).\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/54\/547\/547fe1db6737e9dc70a7eb8c25ad05f6.svg\" width=\"240\" height=\"40\" data-width=\"30.474\" data-height=\"5.123\" data-vertical-align=\"-1.996\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/54\/547\/547fe1db6737e9dc70a7eb8c25ad05f6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/54\/547\/547fe1db6737e9dc70a7eb8c25ad05f6.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \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 \u0438\u0437 \u0430\u043b\u0433\u0435\u0431\u0440\u044b <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Hom}(G a, a)\" alt=\"\\mathrm{Hom}(G a, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg\" width=\"88\" height=\"16\" data-width=\"11.651\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"Id\" alt=\"Id\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/490\/490aa6e856ccf208a054389e47ce0d06.svg\" width=\"16\" height=\"12\" data-width=\"2.317\" data-height=\"1.593\" data-vertical-align=\"-0.023\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/490\/490aa6e856ccf208a054389e47ce0d06.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/490\/490aa6e856ccf208a054389e47ce0d06.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u00ab\u043f\u043e\u0445\u043e\u0436\u0435\u00bb \u2014 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{Hom}(G a, a)\" alt=\"\\mathrm{Hom}(G a, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg\" width=\"88\" height=\"16\" data-width=\"11.651\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/188\/18894d416b4aa7f0109d04b8b3b95832.svg 781w\" loading=\"lazy\" decode=\"async\"\/> <em>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0430<\/em> \u043f\u043e <img decoding=\"async\" class=\"formula inline\" source=\"a\" alt=\"a\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0c\/0cc\/0cc175b9c0f1b6a831c399e269772661.svg\" width=\"12\" height=\"12\" data-width=\"1.197\" data-height=\"1.02\" data-vertical-align=\"-0.023\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0c\/0cc\/0cc175b9c0f1b6a831c399e269772661.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0c\/0cc\/0cc175b9c0f1b6a831c399e269772661.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u00ab\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u00bb. \u0411\u043b\u0430\u0433\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \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, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"scala\">type Algebra[G[_]] = [A] =&gt;&gt; G[A] =&gt; A \/\/ Hom(Ga, a)type \u03bc[G[_]] = Algebra[G] ~&gt; Id \/\/ \u00ab\u043f\u0441\u0435\u0432\u0434\u043e\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435\u00bb \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435type Pointed[F[_], X] = [A] =&gt;&gt; X + F[A]    \/\/ F\u0307\u2093type Free\u03bc[F[_]] = [X] =&gt;&gt; \u03bc[Pointed[F, X]] \/\/ \u03bc F\u0307\u2093given free\u03bcFunctor: [F[_]] =&gt; Functor[Free\u03bc[F]] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fa: Free\u03bc[F][A]) =&gt;      [X] =&gt; (alg: Algebra[Pointed[F, B]][X]) =&gt; fa:        case Left(a)   =&gt; alg(Left(f(a)))        case Right(fx) =&gt; alg(Right(fx))    given free\u03bcMonad: [F[_]] =&gt; Monad[Free\u03bc[F]] = (    fmap    = free\u03bcFunctor,    pure    = [A] =&gt; (a: A) =&gt; [X] =&gt; (alg: Algebra[Pointed[F, A]][X]) =&gt; alg(Left(a)),    flatten = [A] =&gt; (ffa: Free\u03bc[F][Free\u03bc[F][A]]) =&gt;      [X] =&gt; (alg: Algebra[Pointed[F, A]][X]) =&gt; ffa[X]:        case Left(fa)  =&gt; fa(alg)        case Right(fc) =&gt; alg(Right(fc))  )def liftFree\u03bc[F[_] : Functor]: F ~&gt; Free\u03bc[F] =  [A] =&gt; (fa: F[A]) =&gt;    [X] =&gt; (alg: Algebra[Pointed[F, A]][X]) =&gt;        alg(Right(fa.map(a =&gt; alg(Left(a)))))    def foldMap\u03bc[F[_], M[_]: Monad as M]: (F ~&gt; M) =&gt; (Free\u03bc[F] ~&gt; M) =    interpreter =&gt; [A] =&gt; (fa: Free\u03bc[F][A]) =&gt; fa:      case Left(a)    =&gt; M.pure(a)      case Right(fma) =&gt; M.flatten(interpreter(fma))<\/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\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/863324\/\" 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>.<\/p>\n<p><a class=\"anchor\" name=\"gadt\" id=\"gadt\"><\/a><\/p>\n<h4>GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0420\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e <img decoding=\"async\" class=\"formula inline\" source=\"Ta = a + F (T a)\" alt=\"Ta = a + F (T a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/22\/228\/228bbbd91d56176ff03f7cc1bc6200bc.svg\" width=\"128\" height=\"16\" data-width=\"16.014\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/22\/228\/228bbbd91d56176ff03f7cc1bc6200bc.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/22\/228\/228bbbd91d56176ff03f7cc1bc6200bc.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c:<\/p>\n<pre><code class=\"scala\">enum Free[F[_], A]:    case Pure(a: A)                   \/\/ \u043f\u0435\u0440\u0432\u043e\u0435  \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435   case Suspend(ffa: F[Free[F, A]])  \/\/ \u0432\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435    def map[B](using Functor[F])(f: A =&gt; B): Free[F, B] =      this match        case Pure(a)     =&gt; Pure(f(a))        case Suspend(fa) =&gt; Suspend(fa.map(_.map(f)))      def flatMap[B](using Functor[F])(f: A =&gt; Free[F, B]): Free[F, B] =      this match        case Pure(a)     =&gt; f(a)        case Suspend(fa) =&gt; Suspend(fa.map(_.flatMap(f)))      \/\/ \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b: (F ~&gt; M) =&gt; (Free[F] ~&gt; M)    def foldMap[M[_]: Monad as M](interpreter: F ~&gt; M): M[A] =      this match        case Pure(a)     =&gt; M.pure(a)        case Suspend(fa) =&gt; interpreter(fa).flatMap(_.foldMap(interpreter))<\/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>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b <code>Free\u03bc<\/code> \u0438 <code>Free<\/code> \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443. \u041f\u0435\u0440\u0432\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0427\u0451\u0440\u0447\u0430 \u0438 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412\u0442\u043e\u0440\u0430\u044f \u0436\u0435 \u0430\u043a\u0446\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0442\u0430\u043a\u043e\u0439 GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Free<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p><a class=\"anchor\" name=\"freer\" id=\"freer\"><\/a><\/p>\n<h3>\u0411\u043e\u043b\u0435\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 Freer<\/h3>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 <code>Free[F]<\/code> \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e <code>F<\/code>. \u0422\u0438\u043f <code>Free\u03bc[F]<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>Functor[F]<\/code> \u043b\u0438\u0448\u044c \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u0430\u00bb <code>liftFree\u03bc: F ~&gt; Free\u03bc[F]<\/code>, \u043d\u043e \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 <code>A =&gt; F[B]<\/code> \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <code>F<\/code>.<\/p>\n<p>\u0420\u0430\u043d\u0435\u0435 \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u00ab\u043d\u0430 \u043f\u043e\u0442\u043e\u043c\u00bb, \u043e\u0431\u0435\u0440\u043d\u0443\u0432 <code>F<\/code> \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435:<\/p>\n<pre><code class=\"scala\">type Freer\u03bc[F[+_]] = [X] =&gt;&gt; \u03bc[Pointed[Coyoneda[F], X]]    given freer\u03bcFunctor: [F[+_]] =&gt; Functor[Freer\u03bc[F]] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fa: Freer\u03bc[F][A]) =&gt;      [X] =&gt; (alg: Algebra[Pointed[Coyoneda[F], B]][X]) =&gt; fa:        case Left(a) =&gt; alg(Left(f(a)))        case Right(fx) =&gt; alg(Right(fx))    given freer\u03bcMonad: [F[+_]] =&gt; Monad[Freer\u03bc[F]] = (    fmap = freer\u03bcFunctor,    pure = [A] =&gt; (a: A) =&gt; [X] =&gt; (alg: Algebra[Pointed[Coyoneda[F], A]][X]) =&gt; alg(Left(a)),    flatten = [A] =&gt; (ffa: Freer\u03bc[F][Freer\u03bc[F][A]]) =&gt;      [X] =&gt; (alg: Algebra[Pointed[Coyoneda[F], A]][X]) =&gt; ffa[X]:        case Left(fa) =&gt; fa(alg)        case Right(fc) =&gt; alg(Right(fc))  )    def liftFreer\u03bc[F[+_]]: F ~&gt; Freer\u03bc[F] =    [A] =&gt; (fa: F[A]) =&gt; [C] =&gt; alg =&gt;      alg(Right(        [R] =&gt; (cont: [X] =&gt; ((X =&gt; C, F[X])) =&gt; R) =&gt;          cont[A](a =&gt; alg(Left(a)), fa)      ))  def foldMap\u03bc[F[+_], M[_] : Monad as M]: (F ~&gt; M) =&gt; (Freer\u03bc[F] ~&gt; M) =    interpreter =&gt; [A] =&gt; (fa: Freer\u03bc[F][A]) =&gt; fa:      case Left(a) =&gt; M.pure(a)      case Right(co) =&gt; co[M[A]]([X] =&gt; (pair: (X =&gt; M[A], F[X])) =&gt;        interpreter(pair._2).flatMap(pair._1)      )<\/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 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>liftFreer\u03bc<\/code> \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0438\u0448\u043a\u043e\u0439 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0438 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044f <code>Functor[F]<\/code>. (\u0425\u043e\u0442\u044f \u043e\u043d \u043d\u0435\u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>interpreter: F ~&gt; M<\/code>, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0435\u0433\u043e \u00ab\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u00bb).<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e-\u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0435\u0441\u0442\u044c, \u0447\u0435\u0440\u0435\u0437 \u0441\u0443\u043c\u043c\u0443 \u0442\u0438\u043f\u043e\u0432. \u042d\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>Suspend<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c <code>X<\/code>, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u0435:<\/p>\n<pre><code class=\"scala\">enum Freer[F[_], A]:    case Pure(a: A) \/\/    \u2193\u2193\u2193\u2193\u2193 Coyoneda[F][Freer[F, A]] \u2193\u2193\u2193\u2193\u2193  case Suspend[F[_], A, X](fx: F[X], cont: X =&gt; Freer[F, A]) extends Freer[F, A]      def map[B](f: A =&gt; B): Freer[F, B] =      this match        case Pure(a)           =&gt; Pure(f(a))        case Suspend(fx, cont) =&gt; Suspend(fx, cont(_).map(f))      def flatMap[B](f: A =&gt; Freer[F, B]): Freer[F, B] =      this match        case Pure(a)           =&gt; f(a)        case Suspend(fx, cont) =&gt; Suspend(fx, cont(_).flatMap(f))      def foldMap[M[_]: Monad as M](interpreter: F ~&gt; M): M[A] =      this match        case Pure(a)           =&gt; M.pure(a)        case Suspend(fx, cont) =&gt; interpreter(fx).flatMap(cont(_).foldMap(interpreter))<\/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\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>Suspend<\/code> \u00ab\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u00bb \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 <code>cont: X =&gt; Freer[F, A]<\/code>, \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u00ab\u043d\u0430 \u043f\u043e\u0442\u043e\u043c\u00bb. \u0412 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <code>map<\/code> \u0438 <code>flatMap<\/code> \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u0448\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code>foldMap<\/code> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u043e <code>Free<\/code> \u0434\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0432\u043e <code>Freer<\/code>. \u0418 \u0432\u0441\u0451 \u0436\u0435, \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b, \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p><a class=\"anchor\" name=\"libs\" id=\"libs\"><\/a><\/p>\n<h3>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 F. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u044d\u0442\u043e <em>\u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg\" width=\"12\" height=\"12\" data-width=\"1.593\" data-height=\"1.532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0434\u0432\u0443\u043c\u044f \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u0430\u00bb \u0438\u0437 <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 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u043c\u0435\u0435\u043c \u0442\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg\" width=\"12\" height=\"12\" data-width=\"1.593\" data-height=\"1.532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b9\/b9e\/b9ece18c950afbfa6b0fdbfa4ff731d3.svg 781w\" loading=\"lazy\" decode=\"async\"\/>:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split} lift &amp; \\colon &amp; F \\rightsquigarrow T, \\\\ \\eta &amp; \\colon &amp; Id \\rightsquigarrow T, \\\\ \\mu &amp; \\colon &amp; \\,T \\circ T \\rightsquigarrow T. \\end{split}\" alt=\"\\begin{split} lift &amp; \\colon &amp; F \\rightsquigarrow T, \\\\ \\eta &amp; \\colon &amp; Id \\rightsquigarrow T, \\\\ \\mu &amp; \\colon &amp; \\,T \\circ T \\rightsquigarrow T. \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/96b\/96b79f5dd1609dd54610c2ecb2bedc52.svg\" width=\"120\" height=\"64\" data-width=\"15.586\" data-height=\"8.145\" data-vertical-align=\"-3.507\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/96b\/96b79f5dd1609dd54610c2ecb2bedc52.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/96b\/96b79f5dd1609dd54610c2ecb2bedc52.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u043e <em>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442<\/em> \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443, \u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e <em>\u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/em>, \u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"T = Id + F + T \\circ T.\" alt=\"T = Id + F + T \\circ T.\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/13\/13f\/13fb993c00dbc21b8ad2f90b83c3c950.svg\" width=\"160\" height=\"16\" data-width=\"20.104\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/13\/13f\/13fb993c00dbc21b8ad2f90b83c3c950.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/13\/13f\/13fb993c00dbc21b8ad2f90b83c3c950.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439. \u0412 \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u044f\u0445 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"T \\circ T\" alt=\"T \\circ T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/285\/285db62b5c23294b7a2954722acef6f6.svg\" width=\"40\" height=\"16\" data-width=\"5.322\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/285\/285db62b5c23294b7a2954722acef6f6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/285\/285db62b5c23294b7a2954722acef6f6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u043c\u043c\u044b \u0447\u0435\u0440\u0435\u0437 \u043b\u0435\u043c\u043c\u0443 \u043d\u0438\u043d\u0434\u0437\u044f-\u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b: <img decoding=\"async\" class=\"formula inline\" source=\"Ta \\cong \\int^x Tx \\times \\mathrm{Hom}(x, a)\" alt=\"Ta \\cong \\int^x Tx \\times \\mathrm{Hom}(x, a)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/87\/87e\/87ea6092a6622d875e6448bc32650b67.svg\" width=\"200\" height=\"40\" data-width=\"25.202\" data-height=\"5.117\" data-vertical-align=\"-1.993\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/87\/87e\/87ea6092a6622d875e6448bc32650b67.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/87\/87e\/87ea6092a6622d875e6448bc32650b67.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u043f\u043e\u0434 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043e\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043c Ta \u0432\u043c\u0435\u0441\u0442\u043e a. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"Ta = a + Fa + \\int^x Tx \\times \\mathrm{Hom}(x, Ta).\" alt=\"Ta = a + Fa + \\int^x Tx \\times \\mathrm{Hom}(x, Ta).\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e3\/0e3b199d1e936a3614983b8febb4aee3.svg\" width=\"296\" height=\"40\" data-width=\"37.043\" data-height=\"5.117\" data-vertical-align=\"-1.993\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e3\/0e3b199d1e936a3614983b8febb4aee3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e3\/0e3b199d1e936a3614983b8febb4aee3.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Cats \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 <a href=\"https:\/\/github.com\/typelevel\/cats\/blob\/main\/free\/src\/main\/scala\/cats\/free\/Free.scala\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/a> \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"scala\">enum Free[F[_], A]:    case Pure(a: A)    case Suspend(fa: F[A])    case FlatMapped[F[_], A, X](fx: Free[F, X], f: X =&gt; Free[F, A]) extends Free[F, 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>\u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0432 cats \u043f\u0440\u0438 \u0441\u0432\u0451\u0440\u0442\u043a\u0435 <code>foldMap<\/code> (\u0430 \u0442\u0430\u043a\u0436\u0435 <code>run<\/code> \u0438 \u0442.\u043f.) \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/typelevel\/cats\/blob\/main\/free\/src\/main\/scala\/cats\/free\/Free.scala#:~:text=final%20def%20step\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430<\/a>:<\/p>\n<pre><code class=\"scala\">  \/**   * Takes one evaluation step in the Free monad, re-associating left-nested binds in the process.   *\/  @tailrec  final def step: Free[S, A] =    this match {  \/\/                          \u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193      case FlatMapped(FlatMapped(c, f), g) =&gt; c.flatMap(cc =&gt; f(cc).flatMap(g)).step      case FlatMapped(Pure(a), f)          =&gt; f(a).step      case x                               =&gt; x    }<\/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\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439: \u043f\u0430\u0440\u0430 \u0448\u0430\u0433\u043e\u0432 \u00ab\u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00bb \u0441\u0440\u0430\u0437\u0443, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432 <code>step<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443 \u0432 \u0431\u0430\u0442\u0443\u0442 (trampoline), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Scalaz \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\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>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.euclideanspace.com\/maths\/discrete\/category\/higher\/yoneda\/index.htm\" rel=\"noopener noreferrer nofollow\">Yoneda<\/a> \u2014 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 <a href=\"https:\/\/www.euclideanspace.com\/\" rel=\"noopener noreferrer nofollow\">EuclideanSpace<\/a> \u041c\u0430\u0440\u0442\u0438\u043d\u0430 \u0411\u0435\u0439\u043a\u0435\u0440\u0430 \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0440\u0430\u0442\u0438\u043d\u043e\u043a<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/webhomes.maths.ed.ac.uk\/~tl\/categories\/yoneda.pdf\" rel=\"noopener noreferrer nofollow\">The Yoneda Lemma: What&#8217;s It All About?<\/a> pdf-\u0441\u0442\u0430\u0442\u044c\u044f \u0422\u043e\u043c\u0430 \u041b\u0435\u0439\u043d\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 <a href=\"https:\/\/bartoszmilewski.com\/\" rel=\"noopener noreferrer nofollow\">\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<\/a>: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/bartoszmilewski.com\/2015\/10\/28\/yoneda-embedding\/\" rel=\"noopener noreferrer nofollow\">Yoneda Embedding<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/bartoszmilewski.com\/2015\/09\/01\/the-yoneda-lemma\/\" rel=\"noopener noreferrer nofollow\">The Yoneda Lemma<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/golem.ph.utexas.edu\/category\/2012\/09\/where_do_monads_come_from.html\" rel=\"noopener noreferrer nofollow\">Where Do Monads Come From?<\/a> \u0441\u0442\u0430\u0442\u044c\u044f \u0422\u043e\u043c\u0430 \u041b\u0435\u0439\u043d\u0441\u0442\u0435\u0440\u0430 \u0438\u0437 \u0435\u0433\u043e <a href=\"https:\/\/golem.ph.utexas.edu\/category\/\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u0444\u0435 n-\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/a> <\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 <\/p>\n<ul>\n<li>\n<p>\u0418\u0437 \u0431\u043b\u043e\u0433\u0430 <a href=\"http:\/\/comonad.com\/reader\/\" rel=\"noopener noreferrer nofollow\">The Comonad.Reader<\/a> \u042d\u0434\u0432\u0430\u0440\u0434\u0430 \u041a\u043c\u0435\u0442\u0442\u0430 <\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/comonad.com\/reader\/2011\/free-monads-for-less\/\" rel=\"noopener noreferrer nofollow\">Free monads for less: Codensity<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/comonad.com\/reader\/2011\/free-monads-for-less-2\/\" rel=\"noopener noreferrer nofollow\">Free monads for less: Yoneda<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/comonad.com\/reader\/2011\/free-monads-for-less-3\/\" rel=\"noopener noreferrer nofollow\">Free monads for less: Yielding IO<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0418\u0437 \u0431\u043b\u043e\u0433\u0430 <a href=\"https:\/\/blog.higher-order.com\/\" rel=\"noopener noreferrer nofollow\">Higher order<\/a> \u0420\u0443\u043d\u0430\u0440\u0430 \u0411\u044c\u044f\u0440\u043d\u0430\u0441\u043e\u043d\u0430 <\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/blog.higher-order.com\/blog\/2013\/11\/01\/free-and-yoneda\/\" rel=\"noopener noreferrer nofollow\">Free Monads and the Yoneda Lemma<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blog.higher-order.com\/blog\/2013\/08\/20\/free-monads-and-free-monoids\/\" rel=\"noopener noreferrer nofollow\">Free Monoids and Free Monads<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/functorial.com\/stack-safety-for-free\/index.pdf\" rel=\"noopener noreferrer nofollow\">Stack Safety for Free<\/a> pdf-\u0441\u0442\u0430\u0442\u044c\u044f \u0424\u0438\u043b\u0430 \u0424\u0440\u0438\u043c\u0435\u043d\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/mandubian.com\/2015\/04\/09\/freer\/\" rel=\"noopener noreferrer nofollow\">FreeR &#8212; Hybrid Free Monads for Reduced Quadratic Complexity\/Observability &amp; Map-Fusion Optimization in Scala<\/a> \u0441\u0442\u0430\u0442\u044c\u044f \u041f\u0430\u0441\u043a\u0430\u043b\u044f \u0412\u043e\u0439\u0442\u043e \u0438\u0437 <a href=\"http:\/\/mandubian.com\/\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u043d\u0434\u0443\u0431\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u0431\u043b\u043e\u0433\u0430<\/a> \u2014 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b Freer<\/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>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u041a\u0430\u043d\u0430, \u0434\u0430\u044e\u0442 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b, \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b. \u0414\u043b\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0447\u0438\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0442\u0430\u043a \u0438 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044f\u0434\u0440\u043e, \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>Free[() =&gt; *, _]<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0431\u0430\u0442\u0443\u0442\u044b, \u0432\u0440\u043e\u0434\u0435 <code>TailRec<\/code> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, <code>Trampoline<\/code> \u0438\u0437 Scalaz \u0438\u043b\u0438 <code>Eval<\/code> \u0438\u0437 Cats;<\/p>\n<\/li>\n<li>\n<p><code>Free[Async, _]<\/code>, \u0433\u0434\u0435 \u043f\u043e\u0434 <code>Async<\/code> \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u043d\u0430\u0434\u0430\u0445 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 <code>IO<\/code>;<\/p>\n<\/li>\n<li>\n<p>\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, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438, \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u043c\u043e\u043d\u0430\u0434\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>List[A] \u2245 Free[(A, *), Unit]<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043c\u043e\u043d\u0430\u0434\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u044d\u0444\u0444\u0435\u043a\u0442\u044b. \u041d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \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\/1044512\/\">https:\/\/habr.com\/ru\/articles\/1044512\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438. \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0443\u0434\u0435\u043b\u0435\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432.\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0439\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0421\u043f\u0435\u0440\u0432\u0430 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, (\u043a\u043e)\u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \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, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0438\u0445 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438.\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u0435. \u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0435\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u043e\u0438\u0441\u043a\u0435 \u043c\u043e\u043d\u0430\u0434\u044b, \u00ab\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u043e\u0439 \u043a \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443\u00bb. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (GADT). \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.\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\u0430\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432\u0421\u043e\u0434\u0435\u043e\u0436\u0430\u043d\u0438\u0435\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u0412\u044b\u0432\u043e\u0434 \u0444\u043e\u0440\u043c\u0443\u043b\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443GADT-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0411\u043e\u043b\u0435\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 Freer\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445\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\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430\u0421\u0430\u043c\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 F \u0432\u0434\u043e\u043b\u044c G \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0434\u0435\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439. \u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 G \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u0430\u043b\u0430 \u00ab\u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 F\u00bb. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438.\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 Functor[F[_]] \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430:given ranFunctor: [F[+_], G[+_]] =&gt; Functor[F \/ G] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: (F \/ G)[A]) =&gt;      [R] =&gt; (cont: B =&gt; G[R]) =&gt;        fga(cont `compose` f)        \/\/  \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191    given lanFunctor: [F[+_], G[+_]] =&gt; Functor[G \\ F] =    [A, B] =&gt; (f: A =&gt; B) =&gt; (fga: (G \\ F)[A]) =&gt;      [R] =&gt; (cont: [X] =&gt; (G[X] =&gt; B) \u00d7 F[X] =&gt; R) =&gt;        fga([X] =&gt; (gxaFx: (G[X] =&gt; A) \u00d7 F[X]) =&gt;          cont(f `compose` gxaFx._1, gxaFx._2))          \/\/   \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u0427\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f  \u2014 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u044d\u043a\u0437\u0438\u0441\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 (\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438) \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043e\u0431\u0435\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u043d\u043e\u0441\u0442\u044c F[_] \u0438 G[_]. \u00ab\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u0430\u044f\u00bb \u0444\u0443\u043d\u043a\u0446\u0438\u044f f: A =&gt; B \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c, \u043b\u0438\u0431\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e. \u0422\u0430\u043a\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.\u0415\u0434\u0438\u043d\u0438\u0446\u0430 \u0438 \u043a\u043e\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 identity: def \u03b5Ran[F[+_], G[+_]]: (F \/ G) \u2218 G ~&gt; F =    [A] =&gt; ran =&gt; ran(identity[G[A]])  def \u03b7Lan[F[+_], G[+_]]: F ~&gt; ((G \\ F) \u2218 G) =    [A] =&gt; (fa: F[A]) =&gt;    [_] =&gt; cont =&gt; cont(identity[G[A]] -&gt; fa)\u0422\u0430\u043a\u0436\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c  \u0442\u0430\u043a\u0438\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0435\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:def uRan[F[+_], G[+_], H[+_]: Functor](\u03b1: H \u2218 G ~&gt; F): H ~&gt; (F \/ G) =    [A] =&gt; (ha: H[A]) =&gt;      [R] =&gt; (cont: A =&gt; G[R]) =&gt;        \u03b1(fmap[H](cont)(ha))    def uLan[F[+_], G[+_], H[+_]: Functor](\u03b1: F ~&gt; (H \u2218 G)): (G \\ F) ~&gt; H =    [A] =&gt; (lana: (G \\ F)[A]) =&gt; lana[H[A]](    [X] =&gt; gxaFx =&gt; fmap[H](gxaFx._1)(\u03b1(gxaFx._2))  )\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043a\u043e)\u0419\u043e\u043d\u0435\u0434\u044b\u0412 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043a\u0430\u043a \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u0432\u0434\u043e\u043b\u044c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Id.\u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u043e\u043d\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443:\u041d\u0438\u043d\u0434\u0437\u044f!\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0446 \u0438 \u043a\u043e\u043a\u043e\u043d\u0435\u0446, \u044d\u0442\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0441 \u043f\u043e\u0434\u0430\u0447\u0438 \u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u0435\u043c\u043c \u043d\u0438\u043d\u0434\u0437\u044f \u0419\u043e\u043d\u0435\u0434\u044b. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043b\u0435\u043c\u043c \u0419\u043e\u043d\u0435\u0434\u044b, \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u0448\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0435\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e (\u043a\u043e)\u043a\u043e\u043d\u0446\u043e\u0432.\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044btype Yoneda[F[+_]] = F \/ Id \/\/ [A] =&gt;&gt; [X] =&gt; (A =&gt; X) =&gt; F[X]\u0432\u0435\u0442\u0432\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 :\/\/ \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\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  inline def id[F[+_]]: F ~&gt; F = [A] =&gt; identity[F[A]](_) \/\/ (fa: F[A]) =&gt; fa    def  liftYo[F[+_]: Functor]:        F  ~&gt; Yoneda[F] = uRan[F, Id, F](id)  def lowerYo[F[+_]         ]: Yoneda[F] ~&gt;        F  = \u03b5Ran[F, Id]\/\/  liftYo[F] \u22c5 lowerYo[F] = id[F]\/\/ lowerYo[F] \u22c5  liftYo[F] = id[Yoneda[F]]\u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 F[_]:\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0419\u043e\u043d\u0435\u0434\u044b Yoneda[F][_],\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0437 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u0438\u0434\u0430 fmap[Yoneda[F]](f),\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a F[_].\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c F[_] \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u00ab\u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u0432 \u043c\u0438\u0440 \u0419\u043e\u043d\u0435\u0434\u044b\u00bb, \u043d\u043e \u043e\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438\u00bb. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f fmap[Yoneda[F]](f) \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435, \u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442 \u0441 \u043d\u0438\u043c \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 f \u2014 \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 fmap \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044e (fusion). \u0418 \u043b\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u041a\u0430\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432 \u043d\u0435\u0433\u043e fmap[F]. \u0415\u0441\u043b\u0438 F[_] \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u0442\u044f\u0436\u0451\u043b\u0443\u044e\u00bb \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0440\u043e\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430), \u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0419\u043e\u043d\u0435\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u0412 \u044d\u0442\u043e\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u043b\u0430.\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0447\u0430\u0441\u0442\u043e. \u0412\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0419\u043e\u043d\u0435\u0434\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0437\u0430\u0442\u043e \u043e\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u041a\u0430\u043d\u0430.\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u0438\u043c\u0435\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:type Coyoneda[F[+_]] = Id \\ F    def  liftCoyo[F[+_]         ]:          F  ~&gt; Coyoneda[F] = \u03b7Lan[F, Id]  def lowerCoyo[F[+_]: Functor]: Coyoneda[F] ~&gt;          F  = uLan[F, Id, F](id)    \/\/  liftCoyo[F] \u22c5 lowerCoyo[F] = id[F]\/\/ lowerCoyo[F] \u22c5  liftCoyo[F] = id[Coyoneda[F]]\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0446\u0435\u043f\u043e\u0447\u0435\u043a fmap, \u043d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0419\u043e\u043d\u0435\u0434\u044b, liftCoyo \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f Functor[F]. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e F[_] \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430!\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e-\u0419\u043e\u043d\u0435\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0438 (\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043e\u0442 \u0435\u0451 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 (lowerCoyo). \u0418 \u0445\u043e\u0442\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 Functor[F], \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u043d\u0451\u0432\u0440 \u043f\u0435\u0440\u0435\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 G[_]. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438, \u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435.\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438\u0414\u0440\u0443\u0433\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u041a\u0430\u043d\u0430, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0440\u0430\u043d\u0435\u0435 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435, \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432\u0434\u043e\u043b\u044c \u0441\u0435\u0431\u044f:type Codensity[F[+_]] = F \/ F \/\/ [a] =&gt;&gt; [x] =&gt; (a =&gt; F[x]) =&gt; F[x]\u0415\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438:given codensityMonad: [F[+_]] =&gt; Monad[Codensity[F]] = (    fmap    = ranFunctor[F, F],    pure    = uRan[F, F, Id](id[F]),    flatten = uRan[F, F, (F \/ F) \u2218 (F \/ F)]( \/\/ \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 H = (F \/ F) \u2218 (F \/ F)    \u03b5Ran[F, F] \u22c5 (id[F\/F] \u2218 \u03b5Ran[F, F])    \/\/ \u03b1: H \u2218 F \u21dd F = \u03b5 \u22c5 (id_{F\/F} \u2218 \u03b5)  )(using compFunctor[F \/ F, F \/ F])      \/\/ \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432)\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 compFunctor \u0431\u044b\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430.\u041c\u043e\u043d\u0430\u0434\u0443 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438  \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043d\u043e \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0451 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c\u00bb \u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0438\/\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 . \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u0438\u0437 F[_] \u0432 Codensity[F][_], \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb F.\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f F[_] \u0437\u0430\u043a\u043e\u043d\u043e\u043f\u043e\u0441\u043b\u0443\u0448\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c:def  liftCodens[F[+_]: Monad     ]: F ~&gt; Codensity[F] = [A] =&gt; (fa: F[A]) =&gt; [X] =&gt; fa.flatMap(_)  def lowerCodens[F[+_]: Monad as F]: Codensity[F] ~&gt; F = [A] =&gt; _(F.pure[A])\/\/  liftCodens[F] \u22c5 lowerCodens[F] = id[F]\/\/ lowerCodens[F] \u22c5  liftCodens[F] = id[Codensity[F]]\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0419\u043e\u043d\u0435\u0434\u044b, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043c\u043e\u043d\u0430\u0434, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432.\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0451 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 fmap \u0438 flatten. \u041f\u0435\u0440\u0432\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435 \u2014 \u043e\u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u041a\u0430\u043d\u0430.\u0412\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0432 \u0448\u0435\u0441\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u2014 \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u0431\u044b \u00ab\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c flatten\u00bb, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0439\u00bb, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u043d\u0438\u044e \u0442\u044f\u0436\u0451\u043b\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b F[_] \u00ab\u0432 \u0448\u0438\u0440\u0438\u043d\u0443\u00bb, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\u00bb \u0431\u0435\u0437 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0439\u00bb) \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439.\u041c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043c\u043e\u043d\u0430\u0434\u044b \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0430\u043b\u0433\u0435\u0431\u0440).\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u043d\u0430\u0434\u0430 \u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 , \u043d\u043e \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u043d\u044b\u0435&#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-482688","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482688","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=482688"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482688\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}