{"id":473426,"date":"2025-09-02T16:29:00","date_gmt":"2025-09-02T16:29:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=473426"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=473426","title":{"rendered":"<span>\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 2. \u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0437\u043e\u0440\u0430<\/h2>\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>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b (\u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>(\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442)<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#motivation\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#definition\" 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=\"#typeFunctors\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#catIso\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#contravariant\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#endofunctors\" rel=\"noopener noreferrer nofollow\">\u042d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#bifunctors\" rel=\"noopener noreferrer nofollow\">\u0411\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#diagonal\" rel=\"noopener noreferrer nofollow\">\u0414\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#const\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#profunctors\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#anyfunctor\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 <code>F[_]<\/code><\/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>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, hom-\u0442\u0438\u043f\u044b, \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f-\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0443\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a <em>\u043f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/em>. \u0424\u043e\u043a\u0443\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0435, \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<h2>\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/h2>\n<p>\u0414\u0430, \u0432\u0441\u0451 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c! \u041d\u0443, \u043f\u043e\u0447\u0442\u0438.<\/p>\n<p>\u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432\u0441\u0435\u0445 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B9#%D0%9C%D0%B0%D0%BB%D0%B0%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043b\u044b\u0445 (\u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b\u0445) \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a>. \u041f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%9A%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0#:~:text=%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%CC%81%D0%BA%D1%81%20%D0%9A%D0%B0%CC%81%D0%BD%D1%82%D0%BE%D1%80%D0%B0%20%E2%80%94%20%D0%BF%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81%20%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2,%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE.\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430 \u041a\u0430\u043d\u0442\u043e\u0440\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441 <em>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/em>, \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0430\u043c, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u0442\u0430\u043a\u0438\u043c\u0438 \u043d\u044e\u0430\u043d\u0441\u0430\u043c\u0438)). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043b\u0438\u0448\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 <em>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0442\u0438\u043f\u043e\u0432, \u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <em>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/em>. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435\u043c\u0438 \u043e\u0434\u043d\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code> (<img decoding=\"async\" class=\"formula inline\" source=\"F: \\star  \\rightarrow \\star\" alt=\"F: \\star  \\rightarrow \\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9bc\/3dc\/31c\/9bc3dc31ce22d47a635f5125cf4d75a7.svg\" width=\"80\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9bc\/3dc\/31c\/9bc3dc31ce22d47a635f5125cf4d75a7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9bc\/3dc\/31c\/9bc3dc31ce22d47a635f5125cf4d75a7.svg 781w\" loading=\"lazy\" decode=\"async\"\/>).<\/p>\n<p>\u041d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 <em>\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b<\/em> \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0431\u0443\u0434\u0435\u0442 hom-\u0442\u0438\u043f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f:<\/p>\n<pre><code class=\"scala\">type Hom[F[_], G[_]]  type Category[Hom[_[_], _[_]]] = ( \/\/ ((* =&gt; *, * =&gt; *) =&gt; *) =&gt; * identity: [F[_]]             =&gt; ()                     =&gt; Hom[F, F], compose : [F[_], G[_], H[_]] =&gt; (Hom[G, H], Hom[F, G]) =&gt; Hom[F, H] )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 hom-\u0442\u0438\u043f\u044b, \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u0433\u0430\u0447\u0435.<\/p>\n<p><a class=\"anchor\" name=\"motivation\" id=\"motivation\"><\/a><\/p>\n<h2>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/h2>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 27 \u043c\u0438\u043d\u0443\u0442 \u0412\u0430\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0434\u0435\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0412\u0430\u0441. \u042d\u0442\u043e \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u043e\u0439 \u043e\u0431\u0437\u043e\u0440, \u043d\u043e, \u0441\u0443\u0434\u044f \u043f\u043e \u043e\u0442\u0437\u044b\u0432\u0430\u043c, \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438, \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f.<\/p>\n<p>\u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u044e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0436\u0430\u043d\u0440 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0447\u0442\u0435\u043d\u0438\u044f. \u0412\u0441\u0451 \u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0443\u0433\u0430 \u043d\u0430 \u0432\u0435\u0447\u0435\u0440)). \u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0432 \u043f\u043e \u0442\u0435\u043c\u0435, \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b. \u042d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 <em>\u043f\u043e\u0441\u043e\u0431\u0438\u0435<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0430 \u0435\u0441\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u00ab\u0441\u043a\u0443\u0447\u043d\u044b\u0445\u00bb \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043d\u0435 \u0442\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443-\u0442\u043e \u0438 \u0432\u0437\u044f\u043b\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438.<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e. \u0421\u043b\u0435\u0436\u0443 \u0437\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437&#8230; \u0423\u0431\u0438\u0440\u0430\u044e \u0442\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u044e \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0441\u0442\u0430\u0440\u0430\u044f\u0441\u044c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u0418\u0437\u0440\u0435\u0434\u043a\u0430 \u0440\u0430\u0437\u0431\u0430\u0432\u043b\u044f\u044e \u0442\u0435\u043a\u0441\u0442 \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0436\u0443 \u044d\u0442\u043e \u0443\u043c\u0435\u0441\u0442\u043d\u044b\u043c)). \u0418 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u0441\u044f\u043a\u0438 (\u0445\u043e\u0442\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u044f \u044d\u0442\u043e \u043d\u0430\u0440\u043e\u0448\u043d\u043e?)).<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043e\u0431\u0437\u043e\u0440, \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0432\u043e\u0451 \u043d\u0435\u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0435 \u043a\u0443\u043d\u0444\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <code>F[_]<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u00ab\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u00bb (\u0442\u043e \u0431\u0438\u0448\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e) \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u00ab\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u00bb \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e <code>Id[_]<\/code>) \u0432 \u0434\u0440\u0443\u0433\u043e\u0439:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{split}F[A] &amp;\\rightarrow&amp; \\;F[B] &amp;\\rightarrow&amp; \\;F[C] &amp;\\rightarrow&amp; \\;F[D]\\\\\\\\&amp;&amp;&amp; \\hspace{1mm} \\Downarrow\\\\\\\\G[A] &amp;\\rightarrow&amp; \\;G[B] &amp;\\rightarrow&amp; \\;G[C] &amp;\\rightarrow&amp; \\;G[D]\\end{split}\" alt=\"\\begin{split}F[A] &amp;\\rightarrow&amp; \\;F[B] &amp;\\rightarrow&amp; \\;F[C] &amp;\\rightarrow&amp; \\;F[D]\\\\\\\\&amp;&amp;&amp; \\hspace{1mm} \\Downarrow\\\\\\\\G[A] &amp;\\rightarrow&amp; \\;G[B] &amp;\\rightarrow&amp; \\;G[C] &amp;\\rightarrow&amp; \\;G[D]\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1c\/1c5\/1c5efef86c355cf572c09eca19dff3a4.svg\" width=\"232\" height=\"112\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1c\/1c5\/1c5efef86c355cf572c09eca19dff3a4.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1c\/1c5\/1c5efef86c355cf572c09eca19dff3a4.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0421\u0442\u0440\u0435\u043b\u043a\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\Downarrow\" alt=\"\\Downarrow\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4d\/4d6\/4d69c6b2bcfc3559f2790a0c8ba18b43.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4d\/4d6\/4d69c6b2bcfc3559f2790a0c8ba18b43.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4d\/4d6\/4d69c6b2bcfc3559f2790a0c8ba18b43.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e, <em>\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e<\/em> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0443\u0442\u0435\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u0442\u0438\u043f\u044b. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e <em>\u043a\u0430\u0436\u0434\u043e\u0439<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>F[A] =&gt; F[B]<\/code> \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 <code>G[A] =&gt; G[B]<\/code>. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u0447\u0442\u043e <em>\u0440\u0430\u0437\u043d\u044b\u0435<\/em> <code>f, g: F[A] =&gt; F[B]<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 <code>h: G[A] =&gt; G[B]<\/code>. \u0412\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u0430\u043a\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u041f\u0440\u0438\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 <code>identity<\/code>. \u0412\u0441\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e G. \u041c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <strong>\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/strong>.<\/p>\n<p><a class=\"anchor\" name=\"definition\" id=\"definition\"><\/a><\/p>\n<h2>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/h2>\n<blockquote>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/234\/758\/a7f\/234758a7fb961024312f54b9e1c6b834.png\" alt=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 F \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 C \u0432 D.\" title=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 F \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 C \u0432 D.\" width=\"1269\" height=\"665\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/234\/758\/a7f\/234758a7fb961024312f54b9e1c6b834.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/234\/758\/a7f\/234758a7fb961024312f54b9e1c6b834.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 F \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 C \u0432 D.<\/figcaption><\/div>\n<\/figure>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u044b\u0432\u043e\u0432 (\u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u00ab\u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u00bb) \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e. \u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043a\u0430\u043a \u0431\u044b \u00ab\u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u00bb \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e, <em>\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442<\/em> \u0435\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439. \u041f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u0443\u044e <a href=\"https:\/\/bartoszmilewski.com\/2014\/05\/08\/understanding-limits-2\/#:~:text=Every%20programmer%20is%20familiar\" rel=\"noopener noreferrer nofollow\">\u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438<\/a>:<\/p>\n<blockquote>\n<p>\u2026 \u043e\u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u2014 \u0443\u043c\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438. \u041c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u044f\u0432\u043b\u0435\u043d\u0438\u0439. \u041f\u043e\u043d\u0438\u043c\u0430\u044f, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u0418 \u043a\u0430\u043a\u043e\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f? \u041d\u0430\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0435\u0451 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 <em>\u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/em>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c! \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c0\/bd3\/936\/2c0bd3936d9e10d79aa9a90bec31ce0c.png\" alt=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.\" title=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.\" width=\"1450\" height=\"762\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2c0\/bd3\/936\/2c0bd3936d9e10d79aa9a90bec31ce0c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c0\/bd3\/936\/2c0bd3936d9e10d79aa9a90bec31ce0c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <em>\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439. <a href=\"https:\/\/www.google.com\/search?q=%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8+%D0%B4%D0%BB%D1%8F+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%89%D0%B5%D0%B3%D0%BE+%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0412 \u043a\u043d\u0438\u0433\u0435 \u041c\u0430\u043a\u043b\u0435\u0439\u043d\u0430<\/a> \u0442\u0430\u043a\u043e\u0435 \u00ab\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u0434\u0430\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439\u00bb, \u0447\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0431\u0438\u0432\u0430\u0435\u0442 \u0441 \u0442\u043e\u043b\u043a\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 <em>\u043d\u0435 \u043e\u0431 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<\/em>, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445, \u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u044e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0438\u043f.<\/p>\n<p>\u041d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u0440\u0443\u0433\u043e\u0439! \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 <em>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/em>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0443 \u041c\u0430\u043a\u043b\u0435\u0439\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0448\u0435\u043c\u0443. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438) \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 hom-\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"scala\">type Hom[Hom1[_, _], Hom2[_, _]] = [A, B] =&gt; Hom1[A, B] =&gt; Hom2[A, B]<\/code><\/pre>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 hom-\u0442\u0438\u043f\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u0443\u044e<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e <em>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f<\/em> \u043a \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p><a class=\"anchor\" name=\"typeFunctors\" id=\"typeFunctors\"><\/a><\/p>\n<h2>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432<\/h2>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 hom-\u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 (\u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u043f\u0435\u043d\u043e\u043f\u043b\u0430\u0441\u0442\u043e\u043c \u043f\u043e \u0441\u0442\u0435\u043a\u043b\u0443))):<\/p>\n<pre><code class=\"scala\">type Category[==&gt;[F[_], G[_]]] = (   identity: [F[_]]             =&gt; ()                 =&gt; F ==&gt; F,   compose : [F[_], G[_], H[_]] =&gt; (G ==&gt; H, F ==&gt; G) =&gt; F ==&gt; H )<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u0435\u0449\u0451 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u044d\u0442\u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"scala\">type Hom[F[_], G[_]] = [A, B] =&gt; (F[A] =&gt; F[B]) =&gt; (G[A] =&gt; G[B])<\/code><\/pre>\n<p>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">given category: Category[Hom] = (   identity = [F[_]] =&gt; () =&gt;     [A, B] =&gt; (fab: F[A] =&gt; F[B]) =&gt; fab,      compose  = [F[_], G[_], H[_]] =&gt; (gh: Hom[G, H], fg: Hom[F, G]) =&gt;     [A, B] =&gt; (fab: F[A] =&gt; F[B]) =&gt; (gh[A, B] compose fg[A, B])(fab) )<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">extension [F[_], A, B](fab: F[A] =&gt; F[B])   def fmap[G[_]](using functor: Hom[F, G]): G[A] =&gt; G[B] =     functor(fab)<\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fmap<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u00ab<strong>f<\/strong>unction <strong>map<\/strong>ping\u00bb \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"scala\">\/\/ \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 Option \u0438 List given functorOptLst: Hom[Option, List] =   [A, B] =&gt; (fOpt: Option[A] =&gt; Option[B]) =&gt; (listA: List[A]) =&gt;     fOpt(listA.headOption).map(_ +: functorOptLst(fOpt)(listA.tail)).toList.flatten     \/\/                     \u2191\u2191\u2191                \u0434\u0430, \u044f \u0447\u0438\u0442\u0435\u0440)))                \u2191\u2191\u2191\u2191\u2191\u2191\u2191  val fOpt: Option[Int] =&gt; Option[String] = _.map(\"\u0441\u0442\u0440\u043e\u043a\u0430 \" + \u0435 _) \/\/ \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442?)) val gLst: List  [Int] =&gt; List  [String] = fopt.fmap[List] \/\/                                             \u2191\u2191\u2191\u2191 fmap!  gLst(List(40, 2)) \/\/ List(\u0441\u0442\u0440\u043e\u043a\u0430 40, \u0441\u0442\u0440\u043e\u043a\u0430 2)<\/code><\/pre>\n<p>\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 hom-\u0442\u0438\u043f\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0442\u0438\u043f\u043e\u0432 <code>Id[_]<\/code>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u0435c\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Functor[_[_]]<\/code>. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043e\u043a \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"catIso\" id=\"catIso\"><\/a><\/p>\n<h2>\u0418\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/h2>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/929144\/#iso\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430<\/a> \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u0447\u0451\u043c \u043e\u0431\u0435 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u044b \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043a\u0430\u043a \u0442\u0443\u0442 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u0434\u0435\u043b\u0430 \u0441 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C} \\cong \\mathcal{D}\" alt=\"\\mathcal{C} \\cong \\mathcal{D}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7d\/7db\/7db84c8591d1ddf1269997fcc0f64438.svg\" width=\"40\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7d\/7db\/7db84c8591d1ddf1269997fcc0f64438.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7d\/7db\/7db84c8591d1ddf1269997fcc0f64438.svg 781w\" loading=\"lazy\" decode=\"async\"\/>?<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0443\u0442 \u0432\u0441\u0451 \u043a\u0430\u043a \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u2014 \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <code>C[_]<\/code> \u0438 <code>D[_]<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <code>f: Hom[C, D]<\/code> \u0438 <code>g: Hom[D, C]<\/code>, \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b<\/p>\n<ul>\n<li>\n<p><code>summon[Category].compose(f, g)<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u043e \u0441 <code>summon[Category].identity[D]()<\/code><\/p>\n<\/li>\n<li>\n<p><code>summon[Category].compose(g, f)<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u043e \u0441 <code>summon[Category].identity[C]()<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<pre><code class=\"scala\">type Pair[X] = X \u00d7 X type Pow2[X] = Boolean =&gt; X  \/\/ X\u00b2<\/code><\/pre>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/p>\n<pre><code class=\"scala\">val functorPairPow2: Hom[Pair, Pow2] =   [A, B] =&gt; (f: Pair[A] =&gt; Pair[B]) =&gt; (a2: Pow2[A]) =&gt;     (b: Boolean) =&gt;       val pairB = f(a2(false), a2(true))       if b then pairB._2 else pairB._1  val functorPow2Pair: Hom[Pow2, Pair] =   [A, B] =&gt; (f: Pow2[A] =&gt; Pow2[B]) =&gt; (pairA: Pair[A]) =&gt;     val b2 = f(b =&gt; if b then pairA._2 else pairA._1)     b2(false) -&gt; b2(true)<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c, \u0441\u0442\u0440\u043e\u0438\u043c \u043b\u044e\u0431\u0443\u044e \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0442\u0430\u043a\u0443\u044e:<\/p>\n<pre><code class=\"scala\">val roundUp: Hom[Pair, Pair]  = summon[Category].compose(functorPow2Pair, functorPairPow2)<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443<\/p>\n<pre><code class=\"scala\">val morph1: Pair[Int] =&gt; Pair[Int] = p =&gt; (p._1 * 2, p._2 + 2) val morph2: Pair[Int] =&gt; Pair[Int] = roundUp(morph1) \/\/ roundUp \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c!  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e morph1(21, 40) \/\/ (42,42) morph2(21, 40) \/\/ (42,42)<\/code><\/pre>\n<p>\u041f\u0443\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>morph2<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <code>Pair[_]<\/code>, \u0437\u0430\u0442\u0435\u043c \u0438\u0434\u0451\u0442 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>Pow2[_]<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u042d\u0442\u043e\u0442 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u0438 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>Pair[_]<\/code>! \u0422\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0430\u0440\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0443\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0447\u0442\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 <code>Pair[_]<\/code> \u0438 <code>Pow2[_]<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"contravariant\" id=\"contravariant\"><\/a><\/p>\n<h2>\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f \u043a \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u043c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 hom-\u0442\u0438\u043f\u0430\u043c, \u0442\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432. \u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0443\u0442\u0438 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u0431, \u043d\u043e \u0438 <em>\u043e\u0431\u0440\u0430\u0442\u0438\u0432 \u0432\u0441\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438<\/em>! \u0422\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <em>\u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c<\/em> \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e <em>\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c<\/em>:<\/p>\n<pre><code class=\"scala\">type     CovariantHom[F[_], G[_]] = [A, B] =&gt; (F[A] =&gt; F[B]) =&gt; (G[A] =&gt; G[B]) type ContravariantHom[F[_], G[_]] = [A, B] =&gt; (F[A] =&gt; F[B]) =&gt; (G[B] =&gt; G[A]) \/\/                                                                 \u2191       \u2191<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"scala\">extension [F[_], A, B](fab: F[A] =&gt; F[B])   inline def fcontramap[G[_]](using contraFunctor: ContravariantHom[F, G]): G[B] =&gt; G[A] =     contraFunctor(fab)  extension [G[_], A](ga: G[A])   inline def contramap[F[_], B](f: F[B] =&gt; F[A])(using ContravariantHom[F, G]): G[B] =     f.fcontraMap[G](ga)<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435, \u043d\u043e \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043d\u0430 <strong>\u0434\u0443\u0430\u043b\u044c\u043d\u0443\u044e<\/strong> (\u0441\u043c. <a href=\"https:\/\/habr.com\/ru\/articles\/929144\/#oposite\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430<\/a>):<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"F_{contaV}(\\mathcal{C}, \\mathcal{D}) \\equiv F_{coV}(\\mathcal{C}^{op}, \\mathcal{D})\" alt=\"F_{contaV}(\\mathcal{C}, \\mathcal{D}) \\equiv F_{coV}(\\mathcal{C}^{op}, \\mathcal{D})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a3\/a32\/a3279458a2a6d27e7447c18195c5c96b.svg\" width=\"216\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a3\/a32\/a3279458a2a6d27e7447c18195c5c96b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a3\/a32\/a3279458a2a6d27e7447c18195c5c96b.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0414\u043b\u044f \u0434\u0432\u0443\u0445 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043a\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f?\u00bb \u0421\u043a\u043e\u0440\u0435\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u0435\u0441\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d \u043a\u043e- \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e-\u043a\u043e-\u043a\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u00abco-\u00bb \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043a\u0430\u043a (\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e!) \u00ab\u0441\u043e-\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab<strong>\u043a\u043e<\/strong>\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u00bb \u2014 \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u00ab<strong>\u0441\u043e<\/strong>\u0432\u043c\u0435\u0441\u0442\u043d\u0430\u044f \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u00bb. \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043c\u043d\u043e\u0433\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0438\u043c\u0435\u044e\u0442 \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 <em>\u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/em> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u0439. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e <strong>\u0441\u043e<\/strong>\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0443\u0442\u0451\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u044b: \u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u043f\u0440\u0435\u0434\u0435\u043b, \u043a\u043e\u043a\u043e\u043d\u0435\u0446 \u0438 \u0442.\u043f.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0414\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0447\u0430\u0441\u0442\u043e \u0441\u043d\u0430\u0431\u0436\u0430\u044e\u0442 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u00abop\u00bb \u043e\u0442 \u00aboposite\u00bb \u2014 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0434\u043b\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438 \u00ab\u043a\u043e-\u00bb \u0445\u043e\u0442\u044c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e, \u043d\u043e \u043d\u0435\u0441\u0451\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443. <strong>\u041a\u043e<\/strong>\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b <strong>\u0441\u043e<\/strong>\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a <strong>\u043a\u043e\u043d\u0442\u0440\u0430<\/strong>\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u043d\u0430 <strong>\u0432\u0441\u0442\u0440\u0435\u0447\u043d\u043e\u0435<\/strong>.<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0438\u0431\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439, \u043b\u0438\u0431\u043e \u043d\u0438 \u0442\u043e\u0442, \u043d\u0438 \u0434\u0440\u0443\u0433\u043e\u0439. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0431\u0430 \u0442\u0438\u043f\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430. \u041d\u0430\u0441 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0417\u0430 \u0442\u043e\u0447\u043a\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0442\u0438\u043f\u043e\u0432. \u0422\u043e\u0433\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0439 \u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>Id[_]<\/code> \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c. \u0422\u0430\u043a\u0436\u0435 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u043b\u044e\u0431\u044b\u043c\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 <code>Id<\/code>, <code>List<\/code>,  <code>Option<\/code>, <code>Reader<\/code>, <code>Witer<\/code> \u0438 \u043f\u0440\u043e\u0447. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0436\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type ToString = [A] =&gt;&gt; A =&gt; String type ToInt    = [A] =&gt;&gt; A =&gt; Int<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<pre><code class=\"scala\">given contraFunctor: ContravariantHom[Id, ToInt] =   [A, B] =&gt; (f: A =&gt; B) =&gt; (_ : ToInt[B]) compose f  val f: Id   [Double] =&gt; Id   [Long  ] = Math.round val g: ToInt[Long  ] =&gt; ToInt[Double] = fcontraMap(f)  val a: ToInt[Long  ] = _.toInt val b: ToInt[Double] = g(a)  b(42.1) \/\/ 42<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <em>\u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438<\/em> (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0442\u0438\u043f\u043e\u0432) \u0431\u0443\u0434\u0435\u0442 \u0441\u043d\u043e\u0432\u0430 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c! \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e,<\/p>\n<pre><code class=\"scala\">given covariantFunctor: Hom[ToInt, ToString] = \/\/ \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440!   [A, B] =&gt; (f: ToInt[A] =&gt; ToInt[B]) =&gt; (toStrA: ToString[A]) =&gt;     f(toStrA andThen {(_ : String).length}) andThen {(_ : Int).toString}  val f: ToInt   [Long] =&gt; ToInt   [Double] = _ compose Math.round val g: ToString[Long] =&gt; ToString[Double] = fmap(f)  val a: ToString[Long  ] = \"covariantTest: \" + _.toString val b: ToString[Double] = g(a)  b(42.1) \/\/ 17<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0442\u0438\u043f\u043e\u0432 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0438 \u043a\u043e- \u043d\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440:<\/p>\n<pre><code class=\"scala\">type Inv = [A] =&gt;&gt; A =&gt; A<\/code><\/pre>\n<p>\u041e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u043d\u0451\u0432\u0440 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 <em>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445<\/em> \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u044b, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438, \u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b <em>\u043c\u0435\u0436\u0434\u0443<\/em> \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. \u0423 \u0432\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0439 <em>\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439<\/em> \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <em>\u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e<\/em> \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043e\u0431\u0437\u043e\u0440\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#variance\" rel=\"noopener noreferrer nofollow\">\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c<\/a>, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\u00bb \u0442\u0438\u043f\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0432\u0430 \u043d\u0435\u0447\u0451\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u0435\u043b\u043e\u043a <code>=&gt;<\/code> (\u0442.\u0435. \u043d\u0435\u0447\u0451\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439), \u0442\u043e \u0435\u0433\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f <em>\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f<\/em>, \u0430 \u0438\u043d\u0430\u0447\u0435 \u2014 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 (<code>Id<\/code>,  <code>Option<\/code> \u0438 \u043f\u0440\u043e\u0447.), \u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c, \u0430 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 (<code>ToString<\/code>, <code>ToInt<\/code>) \u2014 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438 (<code>Inv<\/code>), \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0431\u0443\u0434\u0435\u0442 <em>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c<\/em>.<\/p>\n<p>\u0412 Scala \u043c\u043e\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443 \u0442\u0438\u043f\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0435\u0433\u043e \u0437\u043d\u0430\u043a, \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">type ToString[-A] =         A       =&gt; String   \/\/ `A` \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442 \u043b\u0435\u0432\u0435\u0435 \u041e\u0414\u041d\u041e\u0419 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 type MyOption[+A] = [X] =&gt; (A =&gt; X) =&gt; (X =&gt; X) \/\/ `A` \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442 \u043b\u0435\u0432\u0435\u0435 \u0414\u0412\u0423\u0425  \u0441\u0442\u0440\u0435\u043b\u043e\u043a<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e, \u0442\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 <code>MyOption<\/code> \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0427\u0451\u0440\u0447\u0430, \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Option.fold<\/code>, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f <code>Option[_]<\/code>. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0427\u0451\u0440\u0447\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0432 \u0432\u0438\u0434\u0435 \u043d\u0435\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 <em>\u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/em>.<\/p>\n<p>\u0410 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>map(f)<\/code> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <em>\u0441\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0430\u043c\u0443\u044e <\/em><code><em>f<\/em><\/code><em> \u0441 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <\/em><code><em>A =&gt; B<\/em><\/code>. \u041d\u043e, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u044b \u043b\u0438 \u043c\u044b \u043d\u0430 \u0442\u0438\u043f <code>A<\/code> \u0438\u043b\u0438 <code>B<\/code>, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <code>X =&gt; A<\/code>, \u0438\u043b\u0438 <code>A =&gt; X<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0427\u0451\u0440\u0447\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u043c \u043d\u0430 \u043f\u0443\u0442\u0438 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>f<\/code> \u2014 \u0432\u044b\u0431\u0440\u0430\u0442\u044c <code>X =&gt; A<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e <code>A =&gt; X<\/code>. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0451\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437 (\u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>MyOption[+_]<\/code>), \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u2014 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u0430 \u0438\u043d\u0430\u0447\u0435 \u2014 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439. \u041d\u0443 \u0430 \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u0441\u0435 \u043b\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0437\u043d\u0430\u043a.<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"endofunctors\" id=\"endofunctors\"><\/a><\/p>\n<h2>\u042d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/h2>\n<p>\u0412\u044b\u0448\u0435 \u0431\u044b\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 <code>Option<\/code> \u0438 <code>List<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435))). \u041e\u043d \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0438\u0434\u0430 <code>F[A] =&gt; F[B]<\/code> \u2014 \u0437\u0430\u043d\u044f\u0442\u0438\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0435, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u043a \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>A =&gt; B<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u00ab\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u00bb \u0438\u0445 \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>F[_]<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <code>Hom[Id, F]<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438:<\/p>\n<pre><code class=\"scala\">type Functor      [F[_]] =     CovariantHom[Id, F] type Contravariant[F[_]] = ContravariantHom[Id, F]<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0442\u0438\u043f\u043e\u0432 \u0441 \u0435\u0451 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439, \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0451 \u0442\u043e\u0439 \u0436\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432! \u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u0447\u044c\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <em>\u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/em>. \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043a\u043e \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c \u0441\u043b\u043e\u044f\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/929144\/#fsubcat\" rel=\"noopener noreferrer nofollow\">\u00ab\u043c\u0430\u0442\u0440\u0451\u0448\u043a\u0438\u00bb \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a>. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u00ab\u0440\u0430\u0437\u043c\u0430\u0442\u0440\u0451\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u00bb \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 <code>F[_]<\/code> \u2014 \u0441\u0430\u043c\u0430\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u0438 \u0447\u0438\u0441\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0438\u043f <code>Functor<\/code>, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 <code>Hom<\/code> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432, \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432, \u043d\u0435\u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0421 \u043d\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">extension [A, B](f: A =&gt; B)   inline def lift[F[_]: Functor as functor]: F[A] =&gt; F[B] =     functor(f)  extension[F[_]: Functor as functor, A] (fa: F[A])   inline def map[B](f: A =&gt; B): F[B] =     f.lift[F](fa) \/\/                  \u2193    \u2193 extension [A, B](f: B =&gt; A)   inline def lift[F[_]: Contravariant as functor]: F[A] =&gt; F[b] =     functor(f)  extension[F[_]: Functor as functor, A] (fa: F[A])   inline def contramap[B](f: B =&gt; A): F[B] =     f.lift[F](fa) \/\/         \u2191    \u2191<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0435\u0442\u043e\u0434 <code>lift<\/code> \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a <code>fmap<\/code>, \u043d\u043e \u00ab\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u00bb \u0438\u0445 \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>F<\/code>. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0436\u0435 \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>map<\/code>, <em>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>F[A]<\/code> \u0432 <code>F[B]<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>A =&gt; B<\/code>.<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435\u043c \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u043a\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u0442\u043e\u0434\u0430 <code>map<\/code> \u0432 Scala, \u043d\u043e, \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type Writer[A] = (A, String) given writerFunctor: Functor[Writer] =   [A, B] =&gt; (f: A =&gt; B) =&gt; (pair: Writer[A]) =&gt;     val res = f(pair._1)     res -&gt; s\"${pair._2} -&gt; $res\"  val a: Writer[Int   ] = (42, \"\u0447\u0438\u0441\u043b\u043e 42\") val b: Writer[String] = a.map(\"\u0441\u0442\u0440\u043e\u043a\u0430 \" + _) \/\/ (\"\u0441\u0442\u0440\u043e\u043a\u0430 42\", \"\u0447\u0438\u0441\u043b\u043e 42 -&gt; \u0441\u0442\u0440\u043e\u043a\u0430 42\") \/\/                        \u2191\u2191\u2191<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u043a\u043e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u0437\u0430\u043a\u043e\u043d\u043e\u0432 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<pre><code class=\"scala\">val f: Boolean =&gt; String  = if _ then \"true\" else \"false\" val g: String  =&gt; Int     = _.length val h: Int     =&gt; Boolean = _ % 2 != 0<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441\u0440\u0430\u0437\u0443 \u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0445 \u00ab\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u00bb \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, \u0441\u043a\u0430\u0436\u0435\u043c, <code>List<\/code> \u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0442\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u043b\u0438 \u0436\u0435 \u0441\u043f\u0435\u0440\u0432\u0430 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <code>Id<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u00ab\u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c\u00bb \u2014 \u043e\u0431\u0430 \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"scala\">given listFunctor: Functor[List] = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: List[A]).map(f) \/\/ \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434  val path1: List[Boolean] =&gt; List[Boolean] = (h            compose g            compose f           ).lift[List] val path2: List[Boolean] =&gt; List[Boolean] =  h.lift[List] compose g.lift[List] compose f.lift[List]  val bLst = List(true, false)       \/\/ \u043b\u044e\u0431\u043e\u0439 \u0441\u043f\u0438\u043e\u043a \u0431\u0443\u043b\u0435\u0432\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 assert(path1(bLst) == path2(bLst)) \/\/ List(false, true)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Cats \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 <a href=\"https:\/\/typelevel.org\/cats\/typeclasses\/functor.html\" rel=\"noopener noreferrer nofollow\">Functor<\/a> \u0438 <a href=\"https:\/\/typelevel.org\/cats\/typeclasses\/contravariant.html\" rel=\"noopener noreferrer nofollow\">Contravariant<\/a>.<\/p>\n<p>\u041f\u0440\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u00ab\u043f\u043e\u0434\u044a\u0451\u043c\u0435\u00bb \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0438 \u0441\u0430\u043c\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439: <code>lift: A =&gt; F[A]<\/code>.  \u0412 Haskell \u0435\u0441\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u00abpointed functor\u00bb \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>point<\/code>, \u00ab\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 (<code>Option<\/code>, <code>List<\/code>, \u2026) \u0447\u0430\u0441\u0442\u043e \u0441\u0430\u043c\u0438\u0445 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0442\u044f\u0436\u0451\u043b\u043e\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u0438\u0438 \u044f\u0437\u044b\u043a\u0430 Haskell \u2014 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u0438\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c, \u0432 Haskell \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e  \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u043e\u0438\u0434\u044b \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u0432 Haskell \u043c\u043e\u0436\u0435\u0442 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c (\u044d\u043d\u0434\u043e)\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u0430 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0430 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0443\u043a\u043e\u0440\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0438 \u0447\u0430\u0441\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438\u0434\u0435\u0439, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0434\u0435\u043b\u0435, \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 \u044d\u0442\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441\u0430\u043c\u0443 \u0432 \u0441\u0435\u0431\u044f, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u0440\u043e\u0434\u0435 <code>List<\/code>, <code>Option<\/code> \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0438 \u0441\u0435\u0431\u0435 \u041e\u041e\u041f-\u0448\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>map<\/code>, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0418 \u0432 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0438\u0445 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438\u2026 \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>F[_]<\/code> <em>\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/em> \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0441 <em>\u0440\u0430\u0437\u043d\u044b\u043c<\/em> \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b <em>\u0440\u0430\u0437\u043d\u044b\u0445<\/em> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e <code>F[_]<\/code>. \u041d\u0435 \u0441\u0442\u0430\u043d\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u00ab\u043d\u0435\u0447\u0438\u0441\u0442\u044b\u0435\u00bb \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0434\u0430\u0436\u0435 \u0441 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c <code>println<\/code>. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0432\u0440\u043e\u0434\u0435 <code>toString<\/code> \u0438 <code>equals<\/code>) \u2014 \u043e\u043d\u0438 \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438 \u0437\u0430\u043a\u043e\u043d\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430. \u041d\u043e \u0434\u0430\u0436\u0435 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u044b\u0435, \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e <code>List<\/code> \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u0435\u0441\u0442\u0438 \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u044b:<\/p>\n<pre><code class=\"scala\">given darkFunctor: Functor[List] =   [A, B] =&gt; (f: A =&gt; B) =&gt; (_: List[A]).map(f).reverse   \/\/                                           \u2191\u2191\u2191\u2191\u2191\u2191\u2191  val func:         Int  =&gt;      String  = (_: Int).toString val lstFunc: List[Int] =&gt; List[String] = func.lift[List] val lst = List(4, 2)  lstFunc(lst) \/\/ List(\"2\", \"4\")<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0435\u0440\u0435\u0433\u0430\u0439\u0442\u0435\u0441\u044c \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439! \u0414\u0430\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432\u043f\u043e\u043b\u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u043f\u043e\u0441\u043b\u0443\u0448\u043d\u044b\u0439. \u041e\u043d \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u043e\u0431 (\u044d\u043d\u0434\u043e)\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c <em>\u043e\u0434\u043d\u043e \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445<\/em> \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 <code>Functor[F]<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"subtyping\" id=\"subtyping\"><\/a><\/p>\n<h2>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412 Scala, \u043a\u0430\u043a \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code> \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u00ab\u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438\u00bb. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0435\u0441\u043b\u0438 <code>A &lt;:&lt; B<\/code>, \u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e <code>F[+_]<\/code> \u0431\u0443\u0434\u0435\u0442 <code>F[A] &lt;:&lt; F[B]<\/code>, \u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e <code>G[-_]<\/code> \u2014 <code>G[B] &lt;:&lt; G[A]<\/code>.<\/p>\n<p>\u0424\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u044b (<img decoding=\"async\" class=\"formula inline\" source=\"\\simeq\" alt=\"\\simeq\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f2b\/f2ba7103efeb39a39b5868f5e3901a47.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f2b\/f2ba7103efeb39a39b5868f5e3901a47.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f2\/f2b\/f2ba7103efeb39a39b5868f5e3901a47.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f) \u043f\u043e\u0434\u0442\u0438\u043f\u0430 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u043f\u0435\u0440\u0442\u0438\u043f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 <em>\u043d\u0435\u044f\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430<\/em>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0444\u0440\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0442\u0430\u043a: \u0434\u043b\u044f <code>F[+_]<\/code> \u0438 \u043b\u044e\u0431\u044b\u0445 <code>A<\/code> \u0438 <code>B<\/code>, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f (\u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f) <code>A =&gt; B<\/code>, \u0442\u043e \u043c\u044b <em>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438<\/em> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e (\u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f) <code>F[A] =&gt; F[B]<\/code>. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442?<\/p>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043d\u0430\u043c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <code>F[+_]<\/code>! \u0418 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 <code>G[-_]<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430. \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432!<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0431\u0435\u0437\u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043d. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u041e\u041e\u041f-\u0448\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0435\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u043a\u043e\u0432\u0430, \u0447\u0442\u043e \u0441\u043c\u0435\u043d\u0430 \u0442\u0438\u043f\u0430 \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <em>\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0435\u0449\u0451 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/em>. \u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f, \u0441\u043b\u0430\u0431\u043e \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432\u0440\u043e\u0434\u0435 <code>Int &lt;:&lt; Long<\/code>) \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (<code>Any<\/code>, <code>Nothing<\/code>), \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438.<\/p>\n<p>\u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432. \u041e\u043d\u0438 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0445 \u0442\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0418 \u0434\u0430\u0436\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043a\u0430\u043a Scala \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c <code>F[A]<\/code> \u0432 <code>F[B]<\/code>, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>A =&gt; B<\/code>, \u0434\u043b\u044f <em>\u043b\u044e\u0431\u044b\u0445<\/em> <code>F[+_]<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435, \u043d\u043e \u0440\u0430\u0437\u043d\u043e\u0448\u0451\u0440\u0441\u0442\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/eed3si9n.com\/learning-scalaz\/Functor.html\" rel=\"noopener noreferrer nofollow\">Scalaz<\/a>, \u0438\u043b\u0438 <a href=\"https:\/\/eed3si9n.com\/herding-cats\/Functor.html\" rel=\"noopener noreferrer nofollow\">Cats<\/a>, \u0438\u043b\u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p><a class=\"anchor\" name=\"bifunctors\" id=\"bifunctors\"><\/a><\/p>\n<h2>\u0411\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/h2>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 <strong>\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c<\/strong>, \u0447\u0442\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043b\u044e\u0431\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0415\u0451 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0430\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u2014 \u043f\u0430\u0440\u044b \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>\u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c<\/strong> (\u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u00abbi-\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0434\u0432\u043e\u0439\u043d\u043e\u0439\u00bb):<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"Bifunctor:\\;\\mathcal{C}\\times\\mathcal{D} \\Rightarrow \\mathcal{E}\" alt=\"Bifunctor:\\;\\mathcal{C}\\times\\mathcal{D} \\Rightarrow \\mathcal{E}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/116\/ac4\/b6c\/116ac4b6ca6fd768da063d0cf0fdb677.svg\" width=\"199\" height=\"20\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/116\/ac4\/b6c\/116ac4b6ca6fd768da063d0cf0fdb677.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/116\/ac4\/b6c\/116ac4b6ca6fd768da063d0cf0fdb677.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u0445\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type Bi[A, B] \/\/ (*, *) =&gt; *<\/code><\/pre>\n<p>\u041e\u043d \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0442\u0438\u043f\u043e\u0432. \u0421\u0430\u043c \u0436\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0439 hom-\u0442\u0438\u043f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434<\/p>\n<pre><code class=\"scala\">type Bifunctor[Bi[_, _]] = [A, B, C, D] =&gt; (A =&gt; C, B =&gt; D) =&gt; (Bi[A, B] =&gt; Bi[C, D])<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 (\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u044d\u043d\u0434\u043e)\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 (\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>Bi[_, _]<\/code>). \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Cats \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/typelevel.org\/cats\/typeclasses\/bifunctor.html\" rel=\"noopener noreferrer nofollow\">Bifunctor<\/a> \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>map<\/code> \u0438 <code>leftMap<\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">extension [A, B, C, D] (fg: (A =&gt; C, B =&gt; D))   inline def fbimap[Bi[_, _]: Bifunctor as bifunctor] = bifunctor[A, B, C, D].tupled(fg)  extension [Bi[_, _]: Bifunctor, A, B] (biab: Bi[A, B])   inline def bimap[C, D](f: A =&gt; C, g: B =&gt; D) = (f, g).fbimap[Bi](biab)<\/code><\/pre>\n<p>\u0421\u0430\u043c\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0441\u0443\u043c\u043c\u043e\u0439 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">infix type + = [A, B] =&gt;&gt;  A Either B infix type \u00d7 = [A, B] =&gt;&gt; (A   ,    B) \/\/             \u2191\u2191\u2191\u2191\u2191\u2191     \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \/\/         \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435     \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \/\/          \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439         \u0442\u0438\u043f\u043e\u0432<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432 <code>Bifunctor<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0438\u0445 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">given sumBifunctor: Bifunctor[+] =   [A, B, C, D] =&gt; (f: A =&gt; C, g: B =&gt; D) =&gt; (ab: A + B) =&gt;     ab.map(g).left.map(f)  given prodBifunctor: Bifunctor[\u00d7] =   [A, B, C, D] =&gt; (f: A =&gt; C, g: B =&gt; D) =&gt; (ab: A \u00d7 B) =&gt;     f(ab._1) -&gt; g(ab._2)<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">val stringOrInt: String + Int = Left(\"2b\")  stringOrInt.bimap(   \"To be or not to be? \" + _,   _ =&gt; 42 ) \/\/ \u043a\u0430\u043a\u043e\u0432 \u0436\u0435 \u043e\u0442\u0432\u0435\u0442?<\/code><\/pre>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438 <em>\u043c\u0443\u043b\u044c\u0442\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/em> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type Trifunctor[Tri[_, _, _]] = [A1, A2, A3, B1, B2, B3] =&gt;   (A1 =&gt; B1, A2 =&gt; B2, A3 =&gt; B3) =&gt; (Tri[A1, A2, A3] =&gt; Tri[B1, B2, B3])<\/code><\/pre>\n<p><a class=\"anchor\" name=\"diagonal\" id=\"diagonal\"><\/a><\/p>\n<h2>\u0414\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0443, \u043f\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <em>\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/em>:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\Delta:\\: \\mathcal{C} \\Rightarrow \\mathcal{C} \\times \\mathcal{C}\" alt=\"\\Delta:\\: \\mathcal{C} \\Rightarrow \\mathcal{C} \\times \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7da\/8c1\/592\/7da8c159217cd823695b4ca0dca4b001.svg\" width=\"121\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7da\/8c1\/592\/7da8c159217cd823695b4ca0dca4b001.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7da\/8c1\/592\/7da8c159217cd823695b4ca0dca4b001.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041e\u043d \u043a\u0430\u043a \u0431\u044b \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\\times\\mathcal{C}\" alt=\"\\mathcal{C}\\times\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/33\/338\/3382d935fec064466f00143a7d084f40.svg\" width=\"40\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/33\/338\/3382d935fec064466f00143a7d084f40.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/33\/338\/3382d935fec064466f00143a7d084f40.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u00ab\u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\u00bb:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/303\/970\/e23\/303970e234af205185de0e47d5b9a0e9.png\" alt=\"\u0418\u0437 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u00ab\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u00bb.\" title=\"\u0418\u0437 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u00ab\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u00bb.\" width=\"1691\" height=\"678\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/303\/970\/e23\/303970e234af205185de0e47d5b9a0e9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/303\/970\/e23\/303970e234af205185de0e47d5b9a0e9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u0437 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u00ab\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u00bb.<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u00ab\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00bb \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e <em>\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442<\/em> \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0418, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:<\/p>\n<pre><code class=\"scala\">type \u0394[A] =  [Bi[_, _]     ] =&gt;&gt; Bi[A, A] \/\/     *  =&gt; (  (*, *) =&gt; *) =&gt;  *<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0441 \u0432\u044b\u0440\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0427\u0451\u0440\u0447\u0430 \u2014 \u0447\u0435\u043c \u0431\u044b \u043d\u0438 \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, <em>\u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/em>! \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0442\u0438\u043f\u043e\u0432, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0443\u0445\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>Bi[_, _]<\/code>.<\/p>\n<p>Hom-\u0442\u0438\u043f \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"scala\">type FunctorDiag = [A, B] =&gt; (A =&gt; B) =&gt; [Bi[_, _]: Bifunctor] =&gt; (Bi[A, A] =&gt; Bi[B, B])<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 hom-\u0442\u0438\u043f \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0448\u0435\u043c \u0435\u0451 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:<\/p>\n<pre><code class=\"scala\">val functorDiag: FunctorDiag =   [A, B] =&gt; (f: A =&gt; B) =&gt; [Bi[_, _]: Bifunctor] =&gt; (aa: Bi[A, A]) =&gt;     aa.bimap(f, f)<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">extension [A, B](f: A =&gt; B)   inline def fmapBi[Bi[_, _] : Bifunctor]: Bi[A, A] =&gt; Bi[B, B] = functorDiag(f)[Bi]  extension [Bi[_, _] : Bifunctor, A](biaa: Bi[A, A])   inline def mapBi[B](f: A =&gt; B): Bi[B, B] = f.fmapBi[Bi](biaa)<\/code><\/pre>\n<p>\u0414\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u0437\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 (\u0441\u0443\u043c\u043c\u044b, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0447.).<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u043d\u043e \u0438 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0435\u0451 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u0436\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\\times\\mathcal{C}\" alt=\"\\mathcal{C}\\times\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a83\/32a\/445\/a8332a445406eed23a0e06c6a2b058f7.svg\" width=\"44\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a83\/32a\/445\/a8332a445406eed23a0e06c6a2b058f7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a83\/32a\/445\/a8332a445406eed23a0e06c6a2b058f7.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043d\u043e \u0438 \u0441 <em>\u043b\u044e\u0431\u044b\u043c<\/em> \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\\times\\ldots\\times\\mathcal{C}\" alt=\"\\mathcal{C}\\times\\ldots\\times\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/583\/41f\/422\/58341f4224b9bf729cdba29b8980847e.svg\" width=\"90\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/583\/41f\/422\/58341f4224b9bf729cdba29b8980847e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/583\/41f\/422\/58341f4224b9bf729cdba29b8980847e.svg 781w\" loading=\"lazy\" decode=\"async\"\/> (\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c n-\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430))). \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"n\" alt=\"n\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg\" width=\"12\" height=\"12\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7b8\/7b8b965ad4bca0e41ab51de7b31363a1.svg 781w\" loading=\"lazy\" decode=\"async\"\/>-\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0443 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014<\/p>\n<p><a class=\"anchor\" name=\"const\" id=\"const\"><\/a><\/p>\n<h2>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/h2>\n<p>\u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/articles\/929144\/#discrete\" rel=\"noopener noreferrer nofollow\">\u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/a> <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{I}\" alt=\"\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 <img decoding=\"async\" class=\"formula inline\" source=\"||\\mathcal{I}||\" alt=\"||\\mathcal{I}||\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg\" width=\"24\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/>:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\mathcal{C} \\times \\dots \\times \\mathcal{C} \\cong \\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C} \\times \\dots \\times \\mathcal{C} \\cong \\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d35\/2f0\/89c\/d352f089cd0d87984d365fac92493a0a.svg\" width=\"137\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d35\/2f0\/89c\/d352f089cd0d87984d365fac92493a0a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d35\/2f0\/89c\/d352f089cd0d87984d365fac92493a0a.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443-\u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f!<\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043c\u0435\u0436\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u043e\u043d \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e <em>\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u044b <img decoding=\"async\" class=\"formula inline\" source=\"c: \\mathcal{C}\" alt=\"c: \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/385\/a8b\/32a\/385a8b32a1490b1d078b0859acb9672c.svg\" width=\"35\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/385\/a8b\/32a\/385a8b32a1490b1d078b0859acb9672c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/385\/a8b\/32a\/385a8b32a1490b1d078b0859acb9672c.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"i:\\mathcal{I}\" alt=\"i:\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6b\/5d6\/146\/a6b5d61468acbe9dfcf514e1c9d6dd03.svg\" width=\"35\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6b\/5d6\/146\/a6b5d61468acbe9dfcf514e1c9d6dd03.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6b\/5d6\/146\/a6b5d61468acbe9dfcf514e1c9d6dd03.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg\" width=\"21\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg\" width=\"21\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ba\/560\/3bd\/7ba5603bd8efd3ec89d0c88528a85591.svg 781w\" loading=\"lazy\" decode=\"async\"\/>\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"||\\mathcal{I}||\" alt=\"||\\mathcal{I}||\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg\" width=\"24\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/af\/afe\/afe78941cf9ad11d5787517bee86c499.svg 781w\" loading=\"lazy\" decode=\"async\"\/>-\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0421\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u00ab\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435\u00bb <img decoding=\"async\" class=\"formula inline\" source=\"\\Delta\\,c:\\: \\mathcal{C}^\\mathcal{I}\" alt=\"\\Delta\\,c:\\: \\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcc\/dcc467c8ee4326ec6f9b4d57c0ad6a13.svg\" width=\"64\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcc\/dcc467c8ee4326ec6f9b4d57c0ad6a13.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcc\/dcc467c8ee4326ec6f9b4d57c0ad6a13.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b <em>\u043a\u0430\u0436\u0434\u043e\u0433\u043e<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"i:\\mathcal{I}\" alt=\"i:\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/235\/e8d\/c85\/235e8dc859363efe8044c4abb9e5f3a3.svg\" width=\"35\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/235\/e8d\/c85\/235e8dc859363efe8044c4abb9e5f3a3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/235\/e8d\/c85\/235e8dc859363efe8044c4abb9e5f3a3.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 <em>\u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435<\/em> \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"c: \\mathcal{C}\" alt=\"c: \\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/669\/319\/951\/6693199515515d88f91f12bf6ee0b475.svg\" width=\"35\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/669\/319\/951\/6693199515515d88f91f12bf6ee0b475.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/669\/319\/951\/6693199515515d88f91f12bf6ee0b475.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c, \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0443\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u2014 \u043e\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0451\u0442 <em>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443<\/em> <img decoding=\"async\" class=\"formula inline\" source=\"c\" alt=\"c\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4a\/4a8\/4a8a08f09d37b73795649038408b5f33.svg\" width=\"12\" height=\"12\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4a\/4a8\/4a8a08f09d37b73795649038408b5f33.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4a\/4a8\/4a8a08f09d37b73795649038408b5f33.svg 781w\" loading=\"lazy\" decode=\"async\"\/>!<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f7\/367\/19e\/3f736719e82591e4664030516ab7ec23.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432  \u0438 , \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 . \u0415\u0441\u043b\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f  \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0430\u044f, \u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432  \u0438 , \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 . \u0415\u0441\u043b\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f  \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0430\u044f, \u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e.\" width=\"932\" height=\"470\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3f7\/367\/19e\/3f736719e82591e4664030516ab7ec23.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f7\/367\/19e\/3f736719e82591e4664030516ab7ec23.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"F_{ab}\" alt=\"F_{ab}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/ba\/bab\/bab65e3465fe96a3595c671c9db551f1.svg\" width=\"24\" height=\"12\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/ba\/bab\/bab65e3465fe96a3595c671c9db551f1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/ba\/bab\/bab65e3465fe96a3595c671c9db551f1.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\Delta_c\" alt=\"\\Delta_c\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c3\/4c351e6a43942dd284e5971f41937e03.svg\" width=\"16\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c3\/4c351e6a43942dd284e5971f41937e03.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4c\/4c3\/4c351e6a43942dd284e5971f41937e03.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg\" width=\"16\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0415\u0441\u043b\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{I}\" alt=\"\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/11\/11c\/11c30e85ef351220045729fb5f1b9006.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0430\u044f, \u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e.<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0432\u0441\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 <img decoding=\"async\" class=\"formula inline\" source=\"\\Delta\\,\u0441\" alt=\"\\Delta\\,\u0441\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/311\/31150768b6ee2e868772ae4d67e28fe9.svg\" width=\"24\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/311\/31150768b6ee2e868772ae4d67e28fe9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/311\/31150768b6ee2e868772ae4d67e28fe9.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 <img decoding=\"async\" class=\"formula inline\" source=\"c:\\mathcal{C}\" alt=\"c:\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/92a\/b73\/987\/92ab739871cf947a1c00fc2289e17f71.svg\" width=\"35\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/92a\/b73\/987\/92ab739871cf947a1c00fc2289e17f71.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/92a\/b73\/987\/92ab739871cf947a1c00fc2289e17f71.svg 781w\" loading=\"lazy\" decode=\"async\"\/>  \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 <em>\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/em>:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\Delta:\\: \\mathcal{C} \\rightarrow \\mathcal{C}^\\mathcal{I}\" alt=\"\\Delta:\\: \\mathcal{C} \\rightarrow \\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/780\/780c9286d035c96acbfac49971278b4e.svg\" width=\"88\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/780\/780c9286d035c96acbfac49971278b4e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/780\/780c9286d035c96acbfac49971278b4e.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/40d\/3da\/754\/40d3da754972e60b7306e0cddddb78e8.png\" alt=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440  \u043c\u0435\u0436\u0434\u0443  \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 .\" title=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440  \u043c\u0435\u0436\u0434\u0443  \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 .\" width=\"762\" height=\"506\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/40d\/3da\/754\/40d3da754972e60b7306e0cddddb78e8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/40d\/3da\/754\/40d3da754972e60b7306e0cddddb78e8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"\\Delta\" alt=\"\\Delta\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/967\/967878d1da852d4b07a961e3168b0fff.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/967\/967878d1da852d4b07a961e3168b0fff.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/96\/967\/967878d1da852d4b07a961e3168b0fff.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043c\u0435\u0436\u0434\u0443 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}\" alt=\"\\mathcal{C}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/dc\/dcf\/dcf5a9d1d0921e88bbbb7524c84d99af.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg\" width=\"16\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}=\\star\" alt=\"\\mathcal{C}=\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2f\/2f0\/2f02230f61c57fdedb8380ea5f831841.svg\" width=\"40\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2f\/2f0\/2f02230f61c57fdedb8380ea5f831841.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2f\/2f0\/2f02230f61c57fdedb8380ea5f831841.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432, \u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{I}=2\" alt=\"\\mathcal{I}=2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3e\/3e8\/3e80782c5d0034e7a416d63525c60a40.svg\" width=\"40\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3e\/3e8\/3e80782c5d0034e7a416d63525c60a40.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3e\/3e8\/3e80782c5d0034e7a416d63525c60a40.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u0443\u044e \u0442\u0438\u043f\u0443 <code>\u0394[_]<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u0430\u043c \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u043d\u043e \u043c\u044b (\u0443\u0436\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0441\u044c, \u0432\u0435\u0440\u043d\u043e?) \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0435.<\/p>\n<p>\u0417\u0430\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0432\u0441\u044e \u0442\u0443 \u0436\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0442\u0438\u043f\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{C}^\\mathcal{I}\" alt=\"\\mathcal{C}^\\mathcal{I}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg\" width=\"16\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ef\/ef1\/ef10a54b2477c4f12ea32057c984fa5e.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u0430 \u0432\u0438\u0434\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow\\star\" alt=\"\\star\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/88\/884\/8840ddb11e11fedcd9f2ffd2f004a9cd.svg\" width=\"40\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/88\/884\/8840ddb11e11fedcd9f2ffd2f004a9cd.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/88\/884\/8840ddb11e11fedcd9f2ffd2f004a9cd.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0412\u0435\u0434\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u043d\u043e \u0438 \u043a\u0430\u043a \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432!<\/p>\n<p>\u0414\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"scala\">type Const[C] = [I] =&gt;&gt; C \/\/ \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 I, \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 C<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Functor[Const]<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0430, \u043a\u0430\u043a \u0438 \u0441\u0430\u043c \u044d\u0442\u043e\u0442 \u0442\u0438\u043f <code>Const[C]<\/code> \u2014 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>identity[C]<\/code>. \u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e, \u0442\u0430\u043a \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443! \u0422\u0438\u043f <code>Const[C]<\/code> \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 (\u0447\u0430\u0449\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435). \u041f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u043d\u0438 \u0438 \u0432 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<p><a class=\"anchor\" name=\"profunctors\" id=\"profunctors\"><\/a><\/p>\n<h2>\u041f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/h2>\n<p>\u0411\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435, \u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043f\u043e \u043e\u0431\u0435\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c. \u041f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0432 \u043f\u0430\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0432 \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u0435\u043b\u043e\u043a), \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043d\u043e, \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c\u0441\u044f, \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u044e\u0442 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b \u043b\u0438\u0448\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443: <code>Pro[-_, +_]<\/code>. \u0411\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u2014 <em>\u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/em>:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"Profunctor:\\;\\mathcal{C}^{op}\\times\\mathcal{D} \\Rightarrow \\mathcal{E}\" alt=\"Profunctor:\\;\\mathcal{C}^{op}\\times\\mathcal{D} \\Rightarrow \\mathcal{E}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cfd\/067\/c2f\/cfd067c2f206021c593f84857a243c59.svg\" width=\"226\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cfd\/067\/c2f\/cfd067c2f206021c593f84857a243c59.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cfd\/067\/c2f\/cfd067c2f206021c593f84857a243c59.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0412\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445:<\/p>\n<pre><code class=\"scala\">infix type =&gt;[-A, +B] = Function[A, B]<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f! \u0414\u0430, \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0432\u0445\u043e\u0434\u043e\u043c, \u0442\u0430\u043a \u0432\u044b\u0445\u043e\u0434\u043e\u043c. \u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u043a\u043e- \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u043d\u0430\u0442\u043d\u044b\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c (\u043a\u0430\u043a \u0438 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443), \u0447\u0442\u043e \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>F[A] =&gt; G[B]<\/code>, \u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type MyPro[-A, +B] = (A, B =&gt; String) =&gt; String  val myPro1: MyPro[Boolean, Int] = (b: Boolean, intToStr: Int =&gt; String) =&gt;   intToStr(if b then 42 else 0) \/\/         \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \u044d\u0442\u043e Functon[Boolean, Int]  val myPro2: MyPro[Boolean, Int] = (b: Boolean, intToStr: Int =&gt; String) =&gt;   if b then intToStr(42) else \"\u044d\u0442\u043e \u043b\u043e\u0436\u044c!\"<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u0435\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0434\u043b\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438), \u0432\u0441\u0435 \u043e\u043d\u0438 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043e\u0431\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>Hom-\u0442\u0438\u043f \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"scala\">type Bifunctor [Bi [_, _]] = [A, B, C, D] =&gt; (A =&gt; C, B =&gt; D) =&gt; (Bi[A, B] =&gt; Bi[C, D]) type Profunctor[==&gt;[_, _]] = [A, B, C, D] =&gt; (C =&gt; A, B =&gt; D) =&gt; (A ==&gt; B) =&gt; (C ==&gt; D) \/\/                                            \u2191    \u2191 - \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0435\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">extension [A, B, C, D] (fg: (C =&gt; A, B =&gt; D))   inline def fdimap[==&gt;[_, _]: Profunctor as profunctor] = profunctor[A, B, C, D].tupled(fg)  extension [==&gt;[_, _]: Profunctor, A, B] (ab: A ==&gt; B)   inline def dimap[C, D](f: C =&gt; A, g: B =&gt; D) = (f, g).fdimap[==&gt;](ab)<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u00abbi-\u00bb \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442\u0430 \u0434\u043b\u044f \u0431\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0436\u0435 <em>\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0430\u044f<\/em> \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u00abdi-\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 (\u043a\u0442\u043e \u0431\u044b \u043c\u043e\u0433 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c?) \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435!)))<\/p>\n<p>\u0412 Cats \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <a href=\"https:\/\/typelevel.org\/cats\/api\/cats\/arrow\/Profunctor.html\" rel=\"noopener noreferrer nofollow\">Profunctor<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c, \u043f\u043e\u043c\u0438\u043c\u043e <code>dimap<\/code>, \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u2014 \u043c\u0435\u0442\u043e\u0434\u044b <code>lmap<\/code>, <code>rmap<\/code> \u0441 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0412\u0430\u0436\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u2014 <em>\u0441\u0442\u0440\u0435\u043b\u043a\u0438<\/em> \u2014 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u043e\u044e \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/807495\/#arrows\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0437\u043e\u0440\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/a>. \u041c\u044b \u0435\u0449\u0451 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0438\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0432 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0438 \u043a\u043e-, \u043d\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f <code>F[_]<\/code>. \u041d\u043e, \u043a\u0430\u043a \u0432\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u043d\u0430\u0441 \u0432\u044b\u0440\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440!<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043b\u044e\u0431\u043e\u0439 <code>F[_]<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 <code>Pro[-_, +_]<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b <code>F[A] = Pro[-A, +A]<\/code>. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Pro[A, A] =&gt; Pro[B, B]<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/strong>:<\/p>\n<pre><code class=\"scala\">type Invariant[F[_]] = [A, B] =&gt; (A =&gt; B, B =&gt; A) =&gt; (F[A] =&gt; F[B])<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"scala\">extension [A, B] (fg: (A =&gt; B, B =&gt; A))   inline def fimap[F[_]: Invariant as ifunctor] = ifunctor[A, B].tupled(fg)  extension [F[_]: Invariant, A] (fa: F[A])   inline def imap[B](f: A =&gt; B, g: B =&gt; A) = (f, g).fimap[F](fa)<\/code><\/pre>\n<p>\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 <code>F[_]<\/code> \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 <em>\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em>. \u0422.\u0435. \u043f\u043e \u0441\u0443\u0442\u0438 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c <code>Pro[-_, +_]<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043e\u0431\u0435 \u0434\u044b\u0440\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f. \u042d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b <a href=\"https:\/\/github.com\/circe\/circe\/blob\/v0.14.13\/modules\/core\/shared\/src\/main\/scala\/io\/circe\/Codec.scala#L58\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/a> (\u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c, \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u043e\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441), \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (<a href=\"https:\/\/typelevel.org\/cats\/api\/cats\/Invariant%24.html#catsInvariantMonoidalForSemigroup:cats.InvariantMonoidal%5Bcats.Semigroup%5D\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430<\/a>) \u0438 \u0442.\u043f.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u043e\u043d\u0430\u0434, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u043e\u043c \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p><a class=\"anchor\" name=\"anyfunctor\" id=\"anyfunctor\"><\/a><\/p>\n<h2>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 F[_]<\/h2>\n<p>\u0412 \u043c\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043e\u0431\u0437\u043e\u0440\u0430\u0445 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<code>Nothing<\/code>, <code>Unit<\/code>, \u2026) \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0443\u043c\u043c, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u041e\u041e\u041f-\u0448\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, (\u0437\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043d\u044b\u0435) \u0442\u0440\u0435\u0439\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0435\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0443\u043c\u043c\u044b, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u0430 \u0442\u0438\u043f\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e-, \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438). \u0414\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430. \u0410 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0442\u043e\u043b\u044c \u0436\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <em>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/em> <code>F[+_]<\/code>, \u0438\u043b\u0438 <code> F[-_]<\/code>?<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Scala, \u0441 \u0435\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432, \u043a\u0430\u043a \u0431\u044b \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e. \u0418 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a!<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u0430\u0433\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 <code>F \u2218 G<\/code>. \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">given compositeFunctor: [F[_] : Functor as fFunctor, G[_] : Functor as gFunctor] =&gt; Functor[F \u2218 G] = [A, B] =&gt; (f: A =&gt; B) =&gt; (fFunctor[G[A], G[B]] compose gFunctor[A, B])(f)<\/code><\/pre>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f <code>List[_]<\/code> \u0438 <code>WighLog[_]<\/code>:<\/p>\n<pre><code class=\"scala\">given listFunctor: Functor[List] = [A, B] =&gt; (f: A =&gt; B) =&gt; (_: List[A]) map f  type WithLog[A] = (String, A) given loggerFunctor: Functor[WithLog] = [A, B] =&gt; (f: A =&gt; B) =&gt; (withLog: WithLog[A]) =&gt; withLog.copy(_2 = f(withLog._2))<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u044e\u0431\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00ab\u043f\u043e\u0434\u043d\u044f\u0442\u044c\u00bb  \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>List \u2218 WithLog<\/code> (\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438):<\/p>\n<pre><code class=\"scala\">val getStrLength = (_: String).length val getLengths = getStrLength.lift[List \u2218 WithLog] \/\/ using compositeFunctor<\/code><\/pre>\n<p>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e:<\/p>\n<pre><code class=\"scala\">val lst: (List \u2218 WithLog)[String] = List(\"\u0436\u0443\u0440\u043d\u0430\u043b 1\" -&gt; \"0\", \"\u0436\u0443\u0440\u043d\u0430\u043b 2\" -&gt; \"42\") getLenghts(lst) \/\/ List((\"\u0436\u0443\u0440\u043d\u0430\u043b 1\", 1), (\"\u0436\u0443\u0440\u043d\u0430\u043b 2\", 2))<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f <em>\u0440\u0430\u0437\u043d\u044b\u043c\u0438<\/em> \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 <em>\u043e\u0434\u043d\u043e\u0433\u043e<\/em> \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg\" width=\"12\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code>, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u2014 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b <code>Functor[F]<\/code>:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0bd\/1d9\/56e\/0bd1d956e32ee262ac8317cc777c1cc4.png\" alt=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435  \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\" title=\"\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435  \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\" width=\"1308\" height=\"535\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0bd\/1d9\/56e\/0bd1d956e32ee262ac8317cc777c1cc4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0bd\/1d9\/56e\/0bd1d956e32ee262ac8317cc777c1cc4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435  \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0443\u0442\u0430\u044e\u0442 \u044d\u0442\u0438 \u0434\u0432\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438.<\/p>\n<p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 <a href=\"https:\/\/github.com\/typelevel\/kittens\" rel=\"noopener noreferrer nofollow\">Kittens<\/a> \u0438\u0437 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Cats, \u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c <code>import cats.derived.*<\/code> \u0438 \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u043a \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>derives<\/code>:<\/p>\n<pre><code class=\"scala\">import cats.derived.*  enum CList[+A] derives Functor:   case CNil   case CCons(head: A, tail: CList[A])<\/code><\/pre>\n<p>\u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>cats.derived.auto.functor.given<\/code> \u2014 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0441\u0442\u0430\u043d\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0442\u0435\u043e\u0440\u0435\u043c\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u0432 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447. \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0438\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#polymorphic_types\" rel=\"noopener noreferrer nofollow\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439<\/a> \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c. \u0424\u0438\u043b\u0438\u043f\u043f \u0412\u0430\u0434\u043b\u0435\u0440 <a href=\"https:\/\/users.cs.utah.edu\/~mflatt\/past-courses\/cs7520\/public_html\/s06\/wadler89.pdf\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0437\u044b\u0432\u0435\u0442<\/a> \u044d\u0442\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 <strong>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438 \u0442\u0435\u043e\u0440\u0435\u043c\u0430\u043c\u0438<\/strong>. \u0422\u0430\u043a\u0436\u0435 \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/bartoszmilewski.com\/2014\/09\/22\/parametricity-money-for-nothing-and-theorems-for-free\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c<\/a> \u0438 \u0443 \u0411\u0430\u0440\u0442\u043e\u0448\u0430 \u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#ad%5C_hoc%5C_polymorphism\" rel=\"noopener noreferrer nofollow\">\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439<\/a> \u0436\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u0434\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0438\u043f\u043e\u0432-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u043a\u043e\u043d\u043e\u0432. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u044f\u0437\u044b\u043a\u0435 C++ \u0441 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 <code>template<\/code>. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C++ \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<\/div>\n<\/details>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430<\/h4>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e. \u0417\u0434\u0435\u0441\u044c \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u043b\u0438\u0448\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 \u0425\u0430\u0431\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u0430\u0440\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u00abFP \u043d\u0430 Scala\u00bb: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/golovachcourses\/articles\/266905\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440?<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/golovachcourses\/articles\/267087\/\" rel=\"noopener noreferrer nofollow\">Invariant Functor<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u0441\u0442\u0430\u0442\u0435\u0439 \u041a\u0448\u0438\u0448\u0442\u043e\u0444\u0430 \u0413\u0440\u0430\u0435\u043a\u0430: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/568096\/\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 Scala Cats<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/568118\/\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 Scala Cats<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/183150\/\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0435\u00a0\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b\u00a0\u0438 \u043c\u043e\u043d\u0430\u0434\u044b \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0445<\/a> \u2014 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043a\u0430\u043a \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/305018\/\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a> \u2014 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0433\u043b\u0430\u0432\u044b \u043a\u043d\u0438\u0433\u0438 \u00ab\u0422\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432\u00bb.<\/p>\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>\u0418\u0442\u0430\u043a, \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0441\u0430\u043c\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043b\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u2014 \u043e\u043d\u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0430\u0441 \u0443\u0434\u0438\u0432\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <em>\u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435\u0442<\/em> \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0410\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0435, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u044b, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0432 \u0438\u0445 \u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u043e \u0441\u0430\u043c\u0438 \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043e\u0431\u0437\u043e\u0440\u0430.<\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code>. \u0418, \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 <code>F[_]<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u0440\u0430\u0437\u043d\u044b\u0435 hom-\u0442\u0438\u043f\u044b \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u043c\u044b \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0422\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u043b\u044f \u043d\u0438\u0445 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Scala. \u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 List, \u0438\u043b\u0438 Option. \u041d\u043e \u0434\u0430\u0436\u0435 \u0442\u0443\u0442 \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0444\u0440\u0430\u0437 \u0442\u0438\u043f\u0430 \u00abList \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u00bb.<\/p>\n<p>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u044d\u0442\u0438 \u0436\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u2014 \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>F[_]<\/code> \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u00abList \u0438 Option \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b\u00bb. (\u041c\u0435\u043d\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0440\u043e\u0431\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u044b\u0448\u0443 \u0442\u0430\u043a\u043e\u0435, \u0430 \u0442\u0443\u0442 \u0435\u0449\u0451 \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c))). \u041e\u0442\u0447\u0430\u0441\u0442\u0438 \u0442\u0430\u043a\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 Haskell, \u0433\u0434\u0435 \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043b\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u044e\u0442 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b List \u0438 Option \u0432 Scala \u0438\u043c\u0435\u044e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>map<\/code>, \u0442.\u0435. \u043e\u043d\u0438 \u00ab\u0432\u043b\u0430\u0434\u0435\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u00bb. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u041e\u041e\u041f-\u0448\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043d\u0438\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u043e\u0442\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b <code>F[_]<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <code>map<\/code>, \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <code>G[_]<\/code>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0418 \u044d\u0442\u043e \u043f\u0440\u0438 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0442\u0430\u043a \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c (= \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c) \u043b\u044e\u0431\u044b\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0414\u0430 \u0438 \u0441\u0430\u043c\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0442\u0430\u043a \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445, \u0432\u0440\u043e\u0434\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 kitten\u2026<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u044d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0435\u0451 F-\u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u0430 <code>Functor[_[_]]<\/code>. \u0418 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <em>\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/em> <code>fFunctor: Functor[F]<\/code> \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438. \u0424\u0440\u0430\u0437\u0430 \u00ab\u0444\u0443\u043d\u043a\u0442\u043e\u0440 List\u00bb \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430 \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443 \u00ab<em>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439<\/em> \u0444\u0443\u043d\u043a\u0442\u043e\u0440 <em>\u0434\u043b\u044f<\/em> <code>List[_]<\/code>\u00bb.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0431\u0435\u0434\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 Scala, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <em>\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/em>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0442\u043e\u0439 \u0436\u0435 Cats \u043a\u043e- \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043a\u043e- \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 (\u0434\u0430 \u0435\u0449\u0451 \u043f\u043b\u044e\u0441 \u043e\u043d \u0441\u0430\u043c \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u0439)!.. \u0422\u0430\u043a\u0430\u044f \u043d\u0435\u043b\u0435\u043f\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 JVM, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u0432\u043e\u0434\u0438\u0442 \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u041a\u043e\u0440\u043e\u0447\u0435, \u0431\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0438 \u043f\u0443\u0441\u0442\u044c \u044f\u0441\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0438\u0445 \u043c\u044b\u0441\u043b\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0443\u043c\u0430\u043d\u0435\u043d\u0430)).<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u0434\u043e \u043c\u043e\u043d\u0430\u0434 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c)). \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ad\/cc4\/8ae\/7adcc48aee4323f6acf3fd5a93105f1e.png\" width=\"620\" height=\"413\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7ad\/cc4\/8ae\/7adcc48aee4323f6acf3fd5a93105f1e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ad\/cc4\/8ae\/7adcc48aee4323f6acf3fd5a93105f1e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0436\u0435 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/933016\/\"> https:\/\/habr.com\/ru\/articles\/933016\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0437\u043e\u0440\u0430<\/h2>\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>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b (\u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>(\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442)<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#motivation\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#definition\" 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=\"#typeFunctors\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#catIso\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#contravariant\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#endofunctors\" rel=\"noopener noreferrer nofollow\">\u042d\u043d\u0434\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#bifunctors\" rel=\"noopener noreferrer nofollow\">\u0411\u0438\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#diagonal\" rel=\"noopener noreferrer nofollow\">\u0414\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#const\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#profunctors\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#anyfunctor\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 <code>F[_]<\/code><\/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>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, hom-\u0442\u0438\u043f\u044b, \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f-\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0443\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a <em>\u043f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/em>. \u0424\u043e\u043a\u0443\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0435, \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<h2>\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/h2>\n<p>\u0414\u0430, \u0432\u0441\u0451 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c! \u041d\u0443, \u043f\u043e\u0447\u0442\u0438.<\/p>\n<p>\u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432\u0441\u0435\u0445 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B9#%D0%9C%D0%B0%D0%BB%D0%B0%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043b\u044b\u0445 (\u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b\u0445) \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a>. \u041f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%9A%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0#:~:text=%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%CC%81%D0%BA%D1%81%20%D0%9A%D0%B0%CC%81%D0%BD%D1%82%D0%BE%D1%80%D0%B0%20%E2%80%94%20%D0%BF%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81%20%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2,%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE.\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430 \u041a\u0430\u043d\u0442\u043e\u0440\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441 <em>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/em>, \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0430\u043c, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u0442\u0430\u043a\u0438\u043c\u0438 \u043d\u044e\u0430\u043d\u0441\u0430\u043c\u0438)). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043b\u0438\u0448\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 <em>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0442\u0438\u043f\u043e\u0432, \u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <em>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/em>. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435\u043c\u0438 \u043e\u0434\u043d\u043e\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code> ().<\/p>\n<p>\u041d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 <em>\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b<\/em> \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0431\u0443\u0434\u0435\u0442 hom-\u0442\u0438\u043f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f:<\/p>\n<pre><code class=\"scala\">type Hom[F[_], G[_]]  type Category[Hom[_[_], _[_]]] = ( \/\/ ((* =&gt; *, * =&gt; *) =&gt; *) =&gt; * identity: [F[_]]             =&gt; ()                     =&gt; Hom[F, F], compose : [F[_], G[_], H[_]] =&gt; (Hom[G, H], Hom[F, G]) =&gt; Hom[F, H] )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 hom-\u0442\u0438\u043f\u044b, \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u0433\u0430\u0447\u0435.<\/p>\n<p><a class=\"anchor\" name=\"motivation\" id=\"motivation\"><\/a><\/p>\n<h2>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/h2>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 27 \u043c\u0438\u043d\u0443\u0442 \u0412\u0430\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0434\u0435\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0412\u0430\u0441. \u042d\u0442\u043e \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u043e\u0439 \u043e\u0431\u0437\u043e\u0440, \u043d\u043e, \u0441\u0443\u0434\u044f \u043f\u043e \u043e\u0442\u0437\u044b\u0432\u0430\u043c, \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438, \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f.<\/p>\n<p>\u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u044e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0436\u0430\u043d\u0440 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0447\u0442\u0435\u043d\u0438\u044f. \u0412\u0441\u0451 \u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0443\u0433\u0430 \u043d\u0430 \u0432\u0435\u0447\u0435\u0440)). \u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0432 \u043f\u043e \u0442\u0435\u043c\u0435, \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b. \u042d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 <em>\u043f\u043e\u0441\u043e\u0431\u0438\u0435<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0430 \u0435\u0441\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u00ab\u0441\u043a\u0443\u0447\u043d\u044b\u0445\u00bb \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043d\u0435 \u0442\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443-\u0442\u043e \u0438 \u0432\u0437\u044f\u043b\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438.<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e. \u0421\u043b\u0435\u0436\u0443 \u0437\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437&#8230; \u0423\u0431\u0438\u0440\u0430\u044e \u0442\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u044e \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0441\u0442\u0430\u0440\u0430\u044f\u0441\u044c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u0418\u0437\u0440\u0435\u0434\u043a\u0430 \u0440\u0430\u0437\u0431\u0430\u0432\u043b\u044f\u044e \u0442\u0435\u043a\u0441\u0442 \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0436\u0443 \u044d\u0442\u043e \u0443\u043c\u0435\u0441\u0442\u043d\u044b\u043c)). \u0418 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u0441\u044f\u043a\u0438 (\u0445\u043e\u0442\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u044f \u044d\u0442\u043e \u043d\u0430\u0440\u043e\u0448\u043d\u043e?)).<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043e\u0431\u0437\u043e\u0440, \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0432\u043e\u0451 \u043d\u0435\u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0435 \u043a\u0443\u043d\u0444\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <code>F[_]<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u00ab\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u00bb (\u0442\u043e \u0431\u0438\u0448\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e) \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u00ab\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u00bb \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e <code>Id[_]<\/code>) \u0432 \u0434\u0440\u0443\u0433\u043e\u0439:<\/p>\n<p>\u0421\u0442\u0440\u0435\u043b\u043a\u0430  \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e, <em>\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e<\/em> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0443\u0442\u0435\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u0442\u0438\u043f\u044b. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e <em>\u043a\u0430\u0436\u0434\u043e\u0439<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>F[A] =&gt; F[B]<\/code> \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 <code>G[A] =&gt; G[B]<\/code>. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u0447\u0442\u043e <em>\u0440\u0430\u0437\u043d\u044b\u0435<\/em> <code>f, g: F[A] =&gt; F[B]<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 <code>h: G[A] =&gt; G[B]<\/code>. \u0412\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u0430\u043a\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u041f\u0440\u0438\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 <code>identity<\/code>. \u0412\u0441\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e G. \u041c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <strong>\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/strong>.<\/p>\n<p><a class=\"anchor\" name=\"definition\" id=\"definition\"><\/a><\/p>\n<h2>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/h2>\n<blockquote>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/p>\n<\/blockquote>\n<figure class=\"full-width\">\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 F \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 C \u0432 D.<\/figcaption><\/div>\n<\/figure>\n<p>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u044b\u0432\u043e\u0432 (\u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u00ab\u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u00bb) \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e. \u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u043a\u0430\u043a \u0431\u044b \u00ab\u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u00bb \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e, <em>\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442<\/em> \u0435\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439. \u041f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u0443\u044e <a href=\"https:\/\/bartoszmilewski.com\/2014\/05\/08\/understanding-limits-2\/#:~:text=Every%20programmer%20is%20familiar\" rel=\"noopener noreferrer nofollow\">\u041c\u0438\u043b\u0435\u0432\u0441\u043a\u0438<\/a>:<\/p>\n<blockquote>\n<p>\u2026 \u043e\u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u2014 \u0443\u043c\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438. \u041c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u044f\u0432\u043b\u0435\u043d\u0438\u0439. \u041f\u043e\u043d\u0438\u043c\u0430\u044f, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u0418 \u043a\u0430\u043a\u043e\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f? \u041d\u0430\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0435\u0451 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 <em>\u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/em>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c! \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<\/blockquote>\n<figure class=\"full-width\">\n<div><figcaption>\u0424\u0443\u043d\u043a\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <em>\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439. <a href=\"https:\/\/www.google.com\/search?q=%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8+%D0%B4%D0%BB%D1%8F+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%89%D0%B5%D0%B3%D0%BE+%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0412 \u043a\u043d\u0438\u0433\u0435 \u041c\u0430\u043a\u043b\u0435\u0439\u043d\u0430<\/a> \u0442\u0430\u043a\u043e\u0435 \u00ab\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u0434\u0430\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439\u00bb, \u0447\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0431\u0438\u0432\u0430\u0435\u0442 \u0441 \u0442\u043e\u043b\u043a\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 <em>\u043d\u0435 \u043e\u0431 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445<\/em>, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445, \u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u044e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0438\u043f.<\/p>\n<p>\u041d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u2014 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u0440\u0443\u0433\u043e\u0439! \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 <em>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/em>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0443 \u041c\u0430\u043a\u043b\u0435\u0439\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0448\u0435\u043c\u0443. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438) \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 hom-\u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"scala\">type Hom[Hom1[_, _], Hom2[_, _]] = [A, B] =&gt; Hom1[A, B] =&gt; Hom2[A, B]<\/code><\/pre>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 hom-\u0442\u0438\u043f\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u0443\u044e<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e <em>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f<\/em> \u043a \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p><a class=\"anchor\" name=\"typeFunctors\" id=\"typeFunctors\"><\/a><\/p>\n<h2>\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432<\/h2>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 hom-\u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 (\u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u043f\u0435\u043d\u043e\u043f\u043b\u0430\u0441\u0442\u043e\u043c \u043f\u043e \u0441\u0442\u0435\u043a\u043b\u0443))):<\/p>\n<pre><code class=\"scala\">type Category[==&gt;[F[_], G[_]]] = (   identity: [F[_]]             =&gt; ()                 =&gt; F ==&gt; F,   compose : [F[_], G[_], H[_]] =&gt; (G ==&gt; H, F ==&gt; G) =&gt; F ==&gt; H )<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u0435\u0449\u0451 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u044d\u0442\u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"scala\">type Hom[F[_], G[_]] = [A, B] =&gt; (F[A] =&gt; F[B]) =&gt; (G[A] =&gt; G[B])<\/code><\/pre>\n<p>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">given category: Category[Hom] = (   identity = [F[_]] =&gt; () =&gt;     [A, B] =&gt; (fab: F[A] =&gt; F[B]) =&gt; fab,      compose  = [F[_], G[_], H[_]] =&gt; (gh: Hom[G, H], fg: Hom[F, G]) =&gt;     [A, B] =&gt; (fab: F[A] =&gt; F[B]) =&gt; (gh[A, B] compose fg[A, B])(fab) )<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 F-\u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">extension [F[_], A, B](fab: F[A] =&gt; F[B])   def fmap[G[_]](using functor: Hom[F, G]): G[A] =&gt; G[B] =     functor(fab)<\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fmap<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u00ab<strong>f<\/strong>unction <strong>map<\/strong>ping\u00bb \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"scala\">\/\/ \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 Option \u0438 List given functorOptLst: Hom[Option, List] =   [A, B] =&gt; (fOpt: Option[A] =&gt; Option[B]) =&gt; (listA: List[A]) =&gt;     fOpt(listA.headOption).map(_ +: functorOptLst(fOpt)(listA.tail)).toList.flatten     \/\/                     \u2191\u2191\u2191                \u0434\u0430, \u044f \u0447\u0438\u0442\u0435\u0440)))                \u2191\u2191\u2191\u2191\u2191\u2191\u2191  val fOpt: Option[Int] =&gt; Option[String] = _.map(\"\u0441\u0442\u0440\u043e\u043a\u0430 \" + \u0435 _) \/\/ \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442?)) val gLst: List  [Int] =&gt; List  [String] = fopt.fmap[List] \/\/                                             \u2191\u2191\u2191\u2191 fmap!  gLst(List(40, 2)) \/\/ List(\u0441\u0442\u0440\u043e\u043a\u0430 40, \u0441\u0442\u0440\u043e\u043a\u0430 2)<\/code><\/pre>\n<p>\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 hom-\u0442\u0438\u043f\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0442\u0438\u043f\u043e\u0432 <code>Id[_]<\/code>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u0435c\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Functor[_[_]]<\/code>. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043e\u043a \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"catIso\" id=\"catIso\"><\/a><\/p>\n<h2>\u0418\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/h2>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/929144\/#iso\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430<\/a> \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u0447\u0451\u043c \u043e\u0431\u0435 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u044b \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043a\u0430\u043a \u0442\u0443\u0442 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u0434\u0435\u043b\u0430 \u0441 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 ?<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0443\u0442 \u0432\u0441\u0451 \u043a\u0430\u043a \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u2014 \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <code>C[_]<\/code> \u0438 <code>D[_]<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <code>f: Hom[C, D]<\/code> \u0438 <code>g: Hom[D, C]<\/code>, \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b<\/p>\n<ul>\n<li>\n<p><code>summon[Category].compose(f, g)<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u043e \u0441 <code>summon[Category].identity[D]()<\/code><\/p>\n<\/li>\n<li>\n<p><code>summon[Category].compose(g, f)<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u043e \u0441 <code>summon[Category].identity[C]()<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<pre><code class=\"scala\">type Pair[X] = X \u00d7 X type Pow2[X] = Boolean =&gt; X  \/\/ X\u00b2<\/code><\/pre>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/p>\n<pre><code class=\"scala\">val functorPairPow2: Hom[Pair, Pow2] =   [A, B] =&gt; (f: Pair[A] =&gt; Pair[B]) =&gt; (a2: Pow2[A]) =&gt;     (b: Boolean) =&gt;       val pairB = f(a2(false), a2(true))       if b then pairB._2 else pairB._1  val functorPow2Pair: Hom[Pow2,<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-473426","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473426","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=473426"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473426\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=473426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=473426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=473426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}