{"id":373532,"date":"2024-05-21T05:38:27","date_gmt":"2024-05-21T05:38:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=373532"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=373532","title":{"rendered":"<span>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0427\u0430\u0441\u0442\u044c 1\/3. \u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af0\/c9b\/b44\/af0c9bb44f12cef6b74980880814cf0e.png\" alt=\"\u0422\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b.\" title=\"\u0422\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b.\" width=\"1200\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/af0\/c9b\/b44\/af0c9bb44f12cef6b74980880814cf0e.png\"\/><\/p>\n<div><figcaption>\u0422\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (<em>generics<\/em>) \u2013 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 1 (\u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f) <\/p>\n<ul>\n<li>\n<p><a href=\"#generic_types\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_constructors\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#polymorphic_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#higher_tyeps\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#type_classes\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#container_types\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 3<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/#container_programming\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043a\u0430\u043a \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/#subcategories_of_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (\u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f)<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#generic_types\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#motivation\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_mehtods\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_classes\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#type_constructors\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#type_operations\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432 Scala<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_functions\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_recursion\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#polymorphic_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#polymorphism_kinds\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#universal_polymorphism\" rel=\"noopener noreferrer nofollow\">\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u03bb-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping_polymorphism\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#variance\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping_bounds\" rel=\"noopener noreferrer nofollow\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#higher_tyeps\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#hkt\" rel=\"noopener noreferrer nofollow\">Higher Kinded Types<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#higher_logic\" rel=\"noopener noreferrer nofollow\">\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_kind\" rel=\"noopener noreferrer nofollow\">\u0412\u0438\u0434 \u0442\u0438\u043f\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_calculus\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#kind_polymorphism\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_universes\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h3>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 Scala-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432, Tagless Final \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0424\u041f-\u0448\u043d\u044b\u0445 \u0432\u043a\u0443\u0441\u043d\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043f\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u0447\u0438\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0438\u0445 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0432\u0443\u0447\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: &#171;\u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b?&#187;. \u0412 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0435 \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0438 \u043f\u043e\u043e\u0431\u0435\u0449\u0430\u043b, \u0447\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u044d\u0442\u0443 \u0442\u0435\u043c\u0443.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0442\u0435\u043c\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u0430. \u0422\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043b\u043e \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0441\u0442\u0432\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0432\u0448\u0435\u0433\u043e, \u043d\u043e \u043d\u0435 \u0443\u0431\u0435\u0436\u0434\u0430\u043b\u043e \u043c\u0435\u043d\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u044f\u0442\u0441\u044f \u043e\u0431\u0449\u0435\u0435 \u0441\u043b\u043e\u0432\u0430, \u043c\u043e\u043b, \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u044e\u0442 &#171;\u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&#187;, &#171;\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e&#187; (\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u0442\u0438\u043f\u0430\u043c-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0442.\u043f.), &#171;\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c&#187; \u0438 \u043f\u0440\u043e\u0447\u0430\u044f &#171;\u0432\u043e\u0434\u0430&#187;. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445) <em>\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/em> \u043d\u0430\u0434 \u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438&#8230; \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u043e \u043c\u043d\u043e\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 \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0438 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b?<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0431\u044b\u0432\u0430\u044e\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u201c\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b\u201d \u2013 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u043e \u0432\u0441\u0451\u043c \u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u044d\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u043e\u043c \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u043e\u0431\u0437\u043e\u0440 \u0442\u0435\u043c\u044b \u0441 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (\u0441\u043c. \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e).<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b\u0431\u0440\u0430\u043d \u044f\u0437\u044b\u043a Scala 3. \u0414\u0430, \u043c\u0430\u043b\u043e \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 (HKT), \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043a\u0430\u043a \u0432 Scala, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0442\u0443\u0442 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u044d\u0442\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e. \u0412\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u0434\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"generic_types\" id=\"generic_types\"><\/a><\/p>\n<h3>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h3>\n<p><a class=\"anchor\" name=\"motivation\" id=\"motivation\"><\/a><\/p>\n<h4>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438\u0441\u044c), \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 web-\u0441\u0435\u0440\u0432\u0435\u0440 (\u0442\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a). \u0412 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u044b\u0431\u0440\u043e\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u043e\u0442\u043b\u043e\u0432. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0435\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u0435\u043d \u2013 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 &#171;\u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u0435&#187; \u0438\u0441\u0445\u043e\u0434\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u044f\u0437\u044b\u043a, \u0432\u0432\u043e\u0434\u044f \u043d\u043e\u0432\u044b\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0440\u043e\u0434\u0435 <code>try\/catch<\/code>.<\/p>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B2%D1%81%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F!-,%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%92%D0%BE%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D0%B2%D1%88%D0%B8%D1%81%D1%8C%20%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5%D0%BC%20%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE\" rel=\"noopener noreferrer nofollow\"><em>\u0441\u0443\u043c\u043c\u044b \u0442\u0438\u043f\u043e\u0432<\/em><\/a> \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"findItem: RegEx \\Rightarrow ItemType + NotFound\" alt=\"findItem: RegEx \\Rightarrow ItemType + NotFound\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd2\/d00\/369\/dd2d00369daf06d90915d952722292ed.svg\" width=\"384\" height=\"20\"\/><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split} getSmthFromWeb:{}&amp; Request \\Rightarrow Response + {}\\\\ Unaccessable + {}&amp; BadRequest + InternalError \\end{split}\" alt=\"\\begin{split} getSmthFromWeb:{}&amp; Request \\Rightarrow Response + {}\\\\ Unaccessable + {}&amp; BadRequest + InternalError \\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/636\/628\/d44\/636628d4458477172649106ce0e5dd08.svg\" width=\"432\" height=\"48\"\/><\/p>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u044f\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u043c\u0443 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \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 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"X\" alt=\"X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/09a\/e93\/164\/09ae93164e079c5f6fa7a74dd3e712d8.svg\" width=\"16\" height=\"17\"\/> \u2013 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0438\u043f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"X\" alt=\"X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/36e\/117\/b6b\/36e117b6b8d28032340cfad831a298cd.svg\" width=\"16\" height=\"17\"\/> \u0438\u0437 \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432-\u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445:<\/p>\n<pre><code class=\"scala\">def foldToString(itemOrNot: ItemType | NotFound)( \/\/ ItemType + NotFound   itemToString: ItemType => String,  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   notFoundResult:   Unit => String   \/\/ \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 ): String =    itemOrNot match     \/\/ \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e ItemType!     case it: ItemType => itemToString(it)     case _: NotFound  => notFoundResult()<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>ItemType | NotFound<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u043e\u0439 \u0442\u0438\u043f\u0430 <code>ItemType<\/code> \u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%B8%D0%B7%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D0%B0%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%3A-,%D0%95%D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D0%B0,-%D0%98%D0%BD%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B2%D0%BE%D0%B7%D0%BD%D0%B8%D0%BA%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\"><em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em><\/a> <code>NotFound<\/code>.<\/p>\n<p>\u0418 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438\u0437 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <code>ItemType<\/code>, \u0438\u043b\u0438 <code>Response<\/code> \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043d\u043e <em>\u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/em> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0441\u0443\u043c\u043c\u044b \u2013 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>fold<\/code> \u2013 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0438 \u043e\u0442 <code>ItemType<\/code>, \u0438\u043b\u0438 <code>Response<\/code>! \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fold<\/code> \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0442\u0438\u043f\u0430 <code>ItemType<\/code> (\u0438\u043b\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, <code>Response<\/code>) \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e &#171;\u0442\u0438\u043f\u0430-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&#187; \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c&#8230;<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0441\u0443\u043c\u043c\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043c\u0435\u0442\u043e\u0434 \u0438\u0449\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445, \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435, \u043e\u0442\u043a\u0443\u0434\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d. \u0422\u0443\u0442 \u0443\u0436\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%BF%D1%80%D0%BE%20%D0%B8%D0%B7%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D1%8B%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2.-,%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%95%D1%81%D0%BB%D0%B8%20%D0%BD%D0%B0%20%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B5\" rel=\"noopener noreferrer nofollow\"><em>\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432<\/em><\/a> <code>Content \u00d7 Source<\/code>, \u0433\u0434\u0435 \u0442\u0438\u043f <code>Content<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0430 <code>Source<\/code> \u2013 \u044d\u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>String<\/code>. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u0442\u0438\u043f\u044b <code>Content<\/code> \u0438 <code>Source<\/code> \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>Content<\/code> \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"scala\">def foldToInt(contentWithSource: Conent &amp; Source)( \/\/ Conent \u00d7 Source   handler: Conent => Source => Int  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ): Int =    \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a handler \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 source   handler(contentWithSource: Conent)(contentWithSource: Source)<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u2013 &#171;\u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439&#187;. \u0415\u0441\u043b\u0438 \u0432 \u043d\u0435\u043a\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u0438\u043f\u0430 <code>Service<\/code>, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u0435 &#171;\u0431\u0438\u0437\u043d\u0435\u0441<strong>\u043e<\/strong>\u0432\u044b\u043c\u0438&#187; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 (\u0438\u043b\u0438 \u0436\u0435 \u043f\u043e-\u041e\u041e\u041f-\u0448\u043d\u043e\u043c\u0443, \u0447\u0443\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u2013 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0433\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, &#171;\u0436\u0430\u0434\u043d\u044b\u0439&#187; \u0437\u0430\u0445\u0432\u0430\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f: <code>(Service, BusinessParam) => Result<\/code>. &#171;\u0416\u0430\u0434\u043d\u043e\u043c\u0443&#187; \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u043b\u0435\u043d\u0438\u0432\u044b\u0439&#187;, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Service<\/code>, \u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f: <code>BusinessParam => (Service => Result)<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%D0%BC%D0%B8.-,%D0%9A%D0%B0%D1%80%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B%20%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B5\" rel=\"noopener noreferrer nofollow\"><em>\u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/em><\/a> \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438! \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u043e, <em>\u0432\u044b\u043d\u0435\u0441\u044f \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/em>, \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u2013 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9!-,%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%A0%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D0%BC%20%D1%81%D1%83%D0%BC%D0%BC%D1%83%20%D0%B4%D0%B2%D1%83%D1%85\" rel=\"noopener noreferrer nofollow\"><em>\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em><\/a> <code>Service => Result<\/code> \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 <code>Result<\/code>, \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"scala\">def foldToResult(   resultByService: Service => Result)( \/\/ Result\u02e2\u1d49\u02b3\u1d5b\u2071\u1d9c\u1d49   service: Service                     \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 ): Result =    resultByService(service)             \/\/ \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Result - \u043d\u0435 \u0432\u0430\u0436\u043d\u043e!<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0432\u0440\u043e\u0434\u0435 <code>Result<\/code>, <code>Content<\/code>, <code>Response<\/code>, <code>ItemType<\/code>) \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u2013 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043d\u043e <em>\u043f\u0430\u0442\u0442\u0435\u0440\u043d<\/em> \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c! \u0411\u044b\u043b\u043e \u0431\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043d\u043e\u0432\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u2013 <em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/em>.<\/p>\n<p><a class=\"anchor\" name=\"generic_mehtods\" id=\"generic_mehtods\"><\/a><\/p>\n<h4>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h4>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0435\u0439 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. <a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/polymorphic-methods.html\" rel=\"noopener noreferrer nofollow\">\u0412 Scala<\/a> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b-\u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0432 \u043a\u0440\u0443\u0433\u043b\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0430 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445. \u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b <code>fold<\/code>, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435:<\/p>\n<pre><code class=\"scala\">def foldToString[ItemType](itemOrNot: ItemType | NotFound)( \/\/ ItemType + NotFound   itemToString: ItemType => String,  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   notFoundResult:   Unit => String   \/\/ \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 ): String = ???                      \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435  def foldToInt[Conent](contentWithSource: Conent &amp; Source)( \/\/ Conent \u00d7 Source   handler: Conent => Source => Int  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ): Int = ???                        \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435  def foldToResult[Result](resultByService: Service => Result)( \/\/ Result\u02e2\u1d49\u02b3\u1d5b\u2071\u1d9c\u1d49   service: Service                  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 ): Result = ???                     \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">val doubleOrNot: Double | NotFound = 4.2 val str = foldToString[Double](doubleOrNot)(d => s\"double: $d\", _ => \"no double found\") \/\/                     \u2191\u2191\u2191\u2191\u2191\u2191 - \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e (\u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)  val intOrNot: Int | NotFound = 42 val str = foldToString(intOrNot)(i => s\"int: $i\", _ => \"no int found\") \/\/                   \u2191\u2191 - \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>foldToString<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e <strong>\u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e<\/strong> \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>ItemType<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <code>Double<\/code> \u0438 <code>Int<\/code>. \u041f\u0440\u0438\u0447\u0451\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0438\u043f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e \u2013 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p>\u0422\u0435\u043b\u043e\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0430\u043c \u0442\u0435\u0440\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0433\u043e, \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0442\u0438\u043f\u0430. \u0422\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 <em>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e<\/em> \u2013 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041c\u0435\u0442\u043e\u0434 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0451\u043c <em>\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f<\/em> \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434 (\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0442\u0438\u043f\u044b.<\/p>\n<p>\u0412 \u0442\u0438\u043f\u0430\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>ItemType | NotFound<\/code>, <code>Conent &amp; Source<\/code>, <code>Service => Result<\/code> \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f <em>\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435<\/em> \u0442\u0438\u043f\u044b-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>ItemType<\/code>, <code>Conent<\/code> \u0438 <code>Result<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u0442\u0440\u0430\u0437\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u043c \u043d\u0435 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434, \u0430 \u0446\u0435\u043b\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443. \u041e\u041e\u041f-\u0448\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 Scala, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441\u044b. \u0418 \u0432 \u043d\u0430\u0448\u0435\u043c \u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0443\u0436\u0435 <em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/em>.<\/p>\n<p><a class=\"anchor\" name=\"generic_classes\" id=\"generic_classes\"><\/a><\/p>\n<h4>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h4>\n<p>\u0422\u0438\u043f\u044b-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/generic-classes.html\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 Scala<\/a> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430.:<\/p>\n<pre><code class=\"scala\">case class ContentAndSource[Content](content: Content, source: String)  trait ContentHandler[Content, Result] {   def handleContent(contentAndSource: ContentAndSource[Content]): Result }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0442\u0438\u043f\u044b-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"scala\">case class MyContent(test: String) \/\/ \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440  val contentHandler = new ContentHandler[MyContent, String] {   def handleContent(contentAndSource: ContentAndSource[Content]) =   s\"\u0418\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 '${contentAndSource.source}' \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435: ${contentAndSource.content.text}\"   \/\/                                    \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 MyContent.text \u2191\u2191\u2191\u2191 }  val myContentAndSource = ContentAndSource(MyContent(\"text\"), \"hardcoded\") \/\/                                      \u2191\u2191 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f - \u043e\u043d \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  val str = contentHnadler.handleContent(myContentAndSource) \/\/ String \/\/ \"\u0418\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 'hardcoded' \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435: text\"<\/code><\/pre>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e \u0432\u0441\u0435\u0445 \u0424\u041f-\u0448\u043d\u044b\u0445 Scala-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b (\u0438 \u0442\u0440\u0435\u0439\u0442\u044b). \u042d\u0442\u043e \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043e, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u044b, <em>\u0442\u0438\u043f\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438<\/em>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u043d\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0435 \u043a \u043d\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0430\u043c\u0438 \u03bb-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u2013 \u0442\u0438\u043f\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0435, \u0430 \u043d\u0435 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c (\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435) \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0418\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438 \u0424\u041f-\u0448\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Scala, \u043d\u043e, \u043f\u0440\u043e\u0449\u0435 \u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043e\u0431 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 Scala \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c JVM, \u043a\u0430\u043a \u201c<a href=\"https:\/\/squidarth.com\/scala\/types\/2019\/01\/11\/type-erasure-scala.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432<\/a>\u201d. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0432 JVM \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0438\u043f\u0435-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/p>\n<pre><code class=\"scala\">def checkType[A](xs: List[A]) = xs match   case _: List[String] \u00a0=> \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a\"   case _ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0=> \"\u0427\u0442\u043e-\u0442\u043e \u0435\u0449\u0451\"<\/code><\/pre>\n<p>\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435<\/p>\n<pre><code>the type test for List[String] cannot be checked at runtime because its type arguments can't be determined from List[A]<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u0438\u043f\u0430-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>List(4, 2)<\/code> \u043e\u043d\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0435\u0440\u043d\u0451\u0442 <code>\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a\"<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <em>\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/em> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0451 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0442\u0438\u043f\u0430. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0430\u043c \u043d\u0435\u0442 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043a\u043e\u0434 \u0445\u043e\u0442\u044c \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0436\u0438\u0434\u0430\u0442\u044c. \u0422\u0430\u043a\u0443\u044e \u201c\u0444\u0438\u0448\u043a\u0443\u201d JVM \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0432\u0438\u0434\u0443 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u0430 \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u201c<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\" rel=\"noopener noreferrer nofollow\"><em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em><\/a>\u201c (generalized algebraic data type, GADT). \u0422\u0435\u0440\u043c\u0438\u043d, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u0441\u0440\u0435\u0434\u0435 \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u043e\u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0438\u043f\u0430\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u043c\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432. \u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u041e\u041e\u041f \u0441\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 (\u043f\u043e\u043b\u0435\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0441\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430), \u0430 \u0441\u0443\u043c\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u0442\u0438\u043f \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u201c<a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/pattern-matching.html#%D0%B7%D0%B0%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D1%82%D0%B8%D0%BF%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c<\/a>\u201d \u0438 \u201c<a href=\"https:\/\/www.scala-lang.org\/files\/archive\/spec\/2.11\/05-classes-and-objects.html#:~:text=A%20final%20class%20may%20not,generally%20redundant%20for%20them%2C%20too.\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/a>\u201d):<\/p>\n<pre><code class=\"scala\">sealed trait CalcResult[R] \/\/ CalcResult[R] \u2245 String + R \u00d7 R\u1d9c\u1d43\u02e1\u1d9c\u1d3c\u1d56\u1d57\u2071\u1d3c\u207f\u02e2 final case class Error(msg: String)    extends CalcResult[Nothing] final case class Successful[R](res: R) extends CalcResult[R]:   def recalcWithOptions(options: CalcOptions): R = ??? \/\/ (CalcOptions => R) \u2261 R\u1d9c\u1d43\u02e1\u1d9c\u1d3c\u1d56\u1d57\u2071\u1d3c\u207f\u02e2<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u0442 <code>CalcResult[_]<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0443\u043c\u043c\u0443 \u0442\u0438\u043f\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u043c\u0438 <code>Error<\/code> \u0438 <code>Successful[_]<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0436\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0424\u041f-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"type_constructors\" id=\"type_constructors\"><\/a><\/p>\n<h3>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d &#171;\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432&#187; \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445. \u0415\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043e\u043f\u0438\u0441\u0430\u0432 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435) \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0422\u0435\u0440\u043c\u0438\u043d \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u0438\u0440\u043e\u0434\u0443 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2013 \u044d\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0442\u0438\u043f (\u0430 \u043d\u0435 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438).<\/p>\n<p>\u041b\u044e\u0431\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0451 \u0442\u0435\u043b\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u0435\u0440\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u044f\u0437\u044b\u043a\u0435 Scala.<\/p>\n<p><a class=\"anchor\" name=\"type_operations\" id=\"type_operations\"><\/a><\/p>\n<h4>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432 Scala<\/h4>\n<p>\u0412 Scala 3 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u043f <code>A<\/code> \u2013 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439, \u0447\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0440\u0442\u0435\u0436 <code>(A, B, C)<\/code> \u2013 \u0441\u0443\u0442\u044c \u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>A | B<\/code> \u2013 \u0435\u0441\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u043e \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u0445 \u0441\u0443\u043c\u043c\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 <code>A &amp; B<\/code> \u2013 \u0435\u0441\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u043e \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e,<\/p>\n<\/li>\n<li>\n<p>&#171;\u0432\u044b\u0437\u043e\u0432&#187; \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <\/p>\n<ul>\n<li>\n<p><code>A => B<\/code> \u2013 \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0434\u043b\u044f <code>Function[A, B]<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>A Either B<\/code> \u2013 \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0434\u043b\u044f <code>Either[A, B]<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>Option[A]<\/code>, <code>Map[K, V]<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>MySupperClass[A, B, C]<\/code> \u2013 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 (\u0438\u043b\u0438 \u0442\u0440\u0435\u0439\u0442\u0430\u043c\u0438), \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Scala.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.scala-lang.org\/scala3\/reference\/new-types\/match-types.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432<\/a>.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u043c\u0430\u0440\u043a\u0430 \u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432: \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0434\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0434\u0430\u043b\u0435\u0435. \u0414\u0432\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0430\u0441\u043f\u0435\u043a\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0442\u0435\u043c\u044b \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"scala\">type Action  = NoAction | ((Service1 &amp; Service2) => MyIO[(SingleResult Either List[AltResult], Log)]) \/\/             \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \/\/                       \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043a\u0443\u0447\u0435\u0440\u044f\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0438 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 ?<\/code><\/pre>\n<p><a class=\"anchor\" name=\"type_functions\" id=\"type_functions\"><\/a><\/p>\n<h4>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438<\/h4>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, \u0442\u0430\u043a \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438, <em>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438<\/em> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, <em>\u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/em> \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0421 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0438 <strong>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u2013 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0442\u0438\u043f<\/strong>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 Scala \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u043f\u0440\u043e\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u0445 <em>\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/em> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>type<\/code>:<\/p>\n<pre><code class=\"scala\">type Union[A, B]          = A | B                     \/\/ \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 type OrErrorAndContext[X] = Union[(X, String), Error] \/\/ \"\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\" (\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432) Union<\/code><\/pre>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e\u043b\u044c\u043a\u043e &#171;\u0442\u0438\u043f&#187; \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0423 \u043d\u0438\u0445 \u0443 \u0432\u0441\u0435\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 &#171;\u0442\u0438\u043f&#187; \u2013 \u044d\u0442\u043e \u0442\u0438\u043f!?<\/p>\n<p>\u0412 Scala 3 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2013 \u03bb-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type    WithContext = [A] =>> (A, String) \/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0442\u0438\u043f\u0430, \u043e\u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u03bb-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435  type IntWithContext = WithContext[Int]    \/\/ \"\u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e\" WithContext \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c Int \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 (Int, String)<\/code><\/pre>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u03bb-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u2013 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c:<\/p>\n<pre><code class=\"scala\">\/\/ \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u043e \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b =:=  summon[(Either[String, Int]) =:= (String Either Int)]     \/\/ \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443 \"\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e\" \/\/      \u2191\u2191\u2191\u2191\u2191\u2191 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c            \u2191\u2191\u2191\u2191\u2191\u2191 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c  summon[(Function[String, Int]) =:= (String Function Int)] \/\/ \u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0436\u0435<\/code><\/pre>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, Scala \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"scala\">type =>[A, B] = Function[A, B] \/\/ \u0442\u0430\u043a\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 type  \u00d7[A, B] =         (A, B) \/\/ \u043d\u043e\u0432\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f  \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0438\u0437 \u0441\u043f\u0435\u0446-\u0441\u0438\u0432\u043e\u043b\u043e\u0432 \u0432 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435: val func: Int => String = _.toString val pair: Int \u00d7  String = (5, \"\u043f\u044f\u0442\u044c\")<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>type<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u0438 \u0442\u0438\u043f\u044b, \u0430 <em>\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/em> \u0442\u0438\u043f\u043e\u0432. \u0422.\u0435. \u044d\u0442\u043e \u043d\u0435\u043a\u0438\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0430 \u0442\u0438\u043f\u0430, \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432. \u042d\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0442\u0435\u0440\u043c\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445). \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0445\u043e\u0436\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0434\u0430\u044e\u0449\u0438\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c. \u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u044b\u0435 \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 Scala \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u0432 \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b (\u0442\u0440\u0435\u0439\u0442\u044b, \u043e\u0431\u044a\u0435\u043a\u0442\u044b), \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/scala-lang.org\/files\/archive\/spec\/2.13\/03-types.html#literal-types\" rel=\"noopener noreferrer nofollow\">\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a>. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u0441\u0442\u0440\u0435\u043b\u043e\u043a, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u0438 \u0442\u0438\u043f\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. \u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043b\u044e\u0431\u044b\u0435 \u0442\u0430\u043a\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u0441\u0442\u0440\u0435\u043b\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0442\u0435\u043b\u043e\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 (\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441\u0443\u043c\u043c, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u0432 \u0438 \u0442.\u043f.):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7d\/94c\/30b\/a7d94c30bee5fb7c0b0e7619427b1b21.png\" alt=\"\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f F[_] \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f B \u0441 \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0442\u0435\u043b\u043e F \u0432\u043c\u0435\u0441\u0442\u043e A.\" title=\"\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f F[_] \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f B \u0441 \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0442\u0435\u043b\u043e F \u0432\u043c\u0435\u0441\u0442\u043e A.\" width=\"1006\" height=\"379\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a7d\/94c\/30b\/a7d94c30bee5fb7c0b0e7619427b1b21.png\"\/><\/p>\n<div><figcaption>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>F[_]<\/code> \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>B<\/code> \u0441 \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0442\u0435\u043b\u043e <code>F<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>A<\/code>.<\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"generic_recursion\" id=\"generic_recursion\"><\/a><\/p>\n<h4>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>\u041e\u0441\u043e\u0431\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0442\u0435\u043b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412 Scala \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u041e\u041e\u041f-\u0441\u0442\u0438\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<pre><code class=\"scala\">sealed trait List[A] case object Nil                                  extends List[Nothing] \/\/ \u043f\u043e\u0447\u0435\u043c\u0443 Nothing - \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435 final case class Cons[A](head: A, tail: List[A]) extends List[A]  val myList: List[Int] = Cons(1, Cons(2, Cons(3, Cons(2, Cons(1, Nil))))) \/\/ 1, 2, 3, 2, 1<\/code><\/pre>\n<p>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c <code>List<\/code> \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u0430. \u041e\u043d\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u0437\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (<code>extends<\/code>). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{align} List[A] &amp;= Nil + Cons[A],\\\\Cons[A] &amp;= A \\times List[A],\\\\Nil &amp;\\cong 1.\\\\\\end{align}\" alt=\"\\begin{align} List[A] &amp;= Nil + Cons[A],\\\\Cons[A] &amp;= A \\times List[A],\\\\Nil &amp;\\cong 1.\\\\\\end{align}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a9\/c03\/5ae\/4a9c035aee1a0e06f9052074fd992913.svg\" width=\"230\" height=\"74\"\/><\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432\u0438\u0434\u043d\u0430 \u044f\u0432\u043d\u043e:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"List[A] \\cong 1 + A \\times List[A].\" alt=\"List[A] \\cong 1 + A \\times List[A].\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a1d\/804\/58d\/a1d80458d871bdb556a1b906fe010ccb.svg\" width=\"224\" height=\"22\"\/><\/p>\n<p>(\u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"A\" alt=\"A\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dad\/775\/bac\/dad775bacb30a20d4a02aa825fcc08d9.svg\" width=\"14\" height=\"17\"\/> \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0438\u043f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"Nothing \\cong 0\" alt=\"Nothing \\cong 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/994\/bb2\/acc\/994bb2acc0465a8fee66d2d4c5ae1818.svg\" width=\"107\" height=\"20\"\/>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"List[Nothing] \\cong 1 \\cong Nil\" alt=\"List[Nothing] \\cong 1 \\cong Nil\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cdc\/55f\/7f3\/cdc55f7f31df748c1a3337fcb96ce0fe.svg\" width=\"209\" height=\"22\"\/>.)<br \/> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043f\u0438\u0441\u043e\u043a \u2013 \u044d\u0442\u043e \u043b\u0438\u0431\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043b\u0438\u0431\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u0433\u043e\u043b\u043e\u0432\u0430) \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (\u0445\u0432\u043e\u0441\u0442).<\/p>\n<p>\u041f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<pre><code class=\"scala\">def sum(list: List[Int]): Int = list match   case Nil              => 0   case Cons(head, tail) => head + sum(tail) \/\/ \u0442\u0443\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f!<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u2013 \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0443\u0436\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b!<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \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 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<pre><code class=\"scala\">sealed trait NonEmptyTree[A] final case class Leaf[A](value: A) extends NonEmptyTree[A] final case class Node[A](left: NonEmptyTree[A], right: NonEmptyTree[A]) extends NonEmptyTree[A]<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0439\u0442\u0443 <code>NonEmptyTree<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"NonEmptyTree[A] \\cong A + NonEmptyTree[A] \\times NonEmptyTree[A].\" alt=\"NonEmptyTree[A] \\cong A + NonEmptyTree[A] \\times NonEmptyTree[A].\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db2\/866\/2e0\/db28662e0c3966255c14af14788c32f9.svg\" width=\"577\" height=\"22\"\/><\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u041e\u041e\u041f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"scala\">type List[A] = Unit + (A, List[A]) \/\/ illegal cyclic type reference...<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <s>\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f<\/s> \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u043c, \u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a <a href=\"https:\/\/contributors.scala-lang.org\/t\/unintuitive-meaning-of-some-recursive-type-aliases\/5776\/2\" rel=\"noopener noreferrer nofollow\">\u0435\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c<\/a> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u2013 \u0442\u0430\u043c \u0442\u0438\u043f\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f &#171;\u043b\u0435\u043d\u0438\u0432\u043e&#187; \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0422\u0430\u043a\u0438\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D1%8B%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\" rel=\"noopener noreferrer nofollow\">\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> (\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438). \u041e\u043d\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 &#171;\u0445\u0440\u0430\u043d\u0438\u0442\u044c&#187; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>\u041d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0449\u0443\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u0438\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b \u0442\u0438\u043f\u043e\u0432 (\u0442\u0438\u043f\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u0432\u0430 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">case class SelfModifyingHandler[A](f: A      => SelfModifyingHandler[A]) case class Wtf[A]                 (f: Wtf[A] => A)<\/code><\/pre>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u0441\u0442\u043e \u043d\u0430\u043c\u0435\u043a\u0430\u044e\u0442&#8230;). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0422\u0435\u043c\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u0433\u0430\u0442\u0430, \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0435\u0451 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0412 \u043d\u0435\u0439 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u0430\u043a\u0438\u0445 \u0432\u043a\u0443\u0441\u043d\u043e\u0441\u0442\u044f\u0445, \u043a\u0430\u043a<\/p>\n<ul>\n<li>\n<p>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e (&#171;\u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 <code>Wtf<\/code>&#171;);<\/p>\n<\/li>\n<li>\n<p>\u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f, \u0442\u0440\u0430\u043c\u043f\u043b\u0438\u043d\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0440\u044f\u0434 \u0422\u0435\u0439\u043b\u043e\u0440\u0430 \u0438 \u043a\u043e\u0440\u043d\u0438 \u043c\u043d\u043e\u0433\u043e\u0447\u043b\u0435\u043d\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 ;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u043e\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u044b \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0445\u0435\u043c\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 (\u043a\u0430\u0442\u0430-, \u0430\u043d\u0430- \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b). \u041e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0437\u043e\u0440.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"polymorphic_types\" id=\"polymorphic_types\"><\/a><\/p>\n<h3>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h3>\n<p><a class=\"anchor\" name=\"polymorphism_kinds\" id=\"polymorphism_kinds\"><\/a><\/p>\n<h4>\u0420\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430<\/h4>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430, \u043d\u043e \u0432\u0440\u044f\u0434 \u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u201c\u043e\u0431\u0449\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c\u201d. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)\" rel=\"noopener noreferrer nofollow\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Polymorphism_(computer_science)\" rel=\"noopener noreferrer nofollow\">Wikipedia<\/a>. \u0422\u0430\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f 1967 \u0433\u043e\u0434\u0430 \u201c<em>Fundamental Concepts in Programming Languages<\/em>\u201d \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0435\u0440\u0430 \u0421\u0442\u0440\u0435\u0439\u0447\u0438, <a href=\"https:\/\/web.archive.org\/web\/20170812012310\/http:\/\/www.itu.dk\/courses\/BPRD\/E2009\/fundamental-1967.pdf\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0438\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0432 2000\u043c<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0438 \u0442\u0430\u043c \u043d\u0435\u0442 <em>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/em> \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u0433\u043e. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<blockquote>\n<p><em>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/em> \u2013 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u043e\u0432 \u0442\u0435\u0440\u043c\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0451\u043c.<br \/> \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0430\u0431\u043e\u0440 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u201c\u0444\u043e\u0440\u043c\u201d, \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c \u043f\u043e \u0442\u0438\u043f\u0443<\/em> (\u0441\u043b\u043e\u0432\u043e \u201c<em>\u03c0\u03bf\u03bb\u03c5\u03bc\u03bf\u03c1\u03c6\u03ae<\/em>\u201c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u0430\u043a \u201c\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u043e\u0440\u043c\u201d).<\/p>\n<\/blockquote>\n<p>\u0412 \u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0421\u0442\u0440\u0435\u0439\u0447\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u043e \u0434\u0432\u0443\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u2013 <em>\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u043c (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c)<\/em> \u0438 <em>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c (ad-hoc)<\/em>. \u0420\u0430\u0437\u043d\u044b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0438, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435, \u0442\u043e \u043d\u0430\u0431\u0435\u0440\u0451\u0442\u0441\u044f \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u044e\u0436\u0438\u043d\u044b. \u041d\u043e, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043b\u044e\u0431\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0432\u0438\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0442\u044f\u043d\u0443\u0442\u044c \u0437\u0430 \u0443\u0448\u0438 \u043b\u0438\u0431\u043e \u043a \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u043c\u0443, \u043b\u0438\u0431\u043e \u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 (\u0438\u043b\u0438 \u0436\u0435 \u043a \u0438\u0445 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f\u043c). \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0445, \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432 \u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u2013 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u201c\u0442\u0438\u043f\u201d.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u0442\u0430\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u044f\u0432\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0438\u043f\u044b \u043b\u044e\u0431\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445. \u0412\u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u044b \u0442\u0435\u0440\u043c\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e \u0435\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041d\u043e \u0442\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c, <em>\u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439<\/em>. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c (\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432), \u0434\u0430\u043b\u0435\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0421\u0442\u0440\u0435\u0439\u0447\u0438 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u0430, \u043d\u043e \u043f\u0440\u0438 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u0437\u0430\u0441\u0438\u043b\u044c\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0435, \u043a\u0430\u043a \u043b\u0438\u0448\u044c \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 &#171;\u0441\u0442\u043e\u043b\u043f\u043e\u0432 \u041e\u041e\u041f&#187;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u043f\u043e <a href=\"https:\/\/blog.skillfactory.ru\/glossary\/polimorfizm\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u043d\u043e\u0439<\/a> \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0443 &#171;\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c&#187;, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c:<\/p>\n<blockquote>\n<p>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c (polymorphism) \u2014 \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u0447\u0435\u043c \u043e\u043d\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<p>\u041d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0443\u043f\u0440\u0435\u043a\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0446\u0438\u0442\u0430\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0432\u043e\u0434\u044f\u0442 \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043c\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0432\u0430\u043b\u0438\u0440\u0443\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u043c \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0438 \u043d\u0430\u0434 \u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c\u044e. \u041e\u041e\u041f-\u0448\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0435.<\/p>\n<p><a class=\"anchor\" name=\"universal_polymorphism\" id=\"universal_polymorphism\"><\/a><\/p>\n<h4>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u03bb-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/h4>\n<p>\u0421\u0430\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e) \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f <strong><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b4b\/11f\/169\/b4b11f169873d02278590566c35b9384.svg\" width=\"11\" height=\"17\"\/>-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f<\/strong>. \u042d\u0442\u0430 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/200\/341\/3d6\/2003413d6689866a2cfc4b05d420ab91.svg\" width=\"11\" height=\"17\"\/>-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u043b\u043e \u0431\u0435\u0437\u0442\u0438\u043f\u043e\u0432\u043e\u0432\u044b\u043c<\/a>. \u0422\u0430\u043c \u0431\u044b\u043b\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/25a\/587\/849\/25a587849663c2735dd8b2be4caed8b8.svg\" width=\"11\" height=\"17\"\/>-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 (\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{align}f&amp;:=\\lambda x.\\;2\\cdot x+1;\\\\f\\;5\\equiv f(5)&amp;=2\\cdot 5+1=11.\\end{align}\" alt=\"\\begin{align}f&amp;:=\\lambda x.\\;2\\cdot x+1;\\\\f\\;5\\equiv f(5)&amp;=2\\cdot 5+1=11.\\end{align}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c2\/a89\/fea\/8c2a89fea192261f4a1bcea86df752cd.svg\" width=\"235\" height=\"48\"\/><\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BB%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0441\u0442\u043e-\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/a> <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda^{\\rightarrow}\" alt=\"\\lambda^{\\rightarrow}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52b\/b66\/395\/52bb663950819f2bcf82d73c992d1f9d.svg\" width=\"27\" height=\"18\"\/>.  \u0417\u0434\u0435\u0441\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0440\u043e\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6e\/335\/01e\/a6e33501e6a891fb5f118a0af34a2e5b.svg\" width=\"11\" height=\"17\"\/> \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043a\u0430-\u0442\u0438\u043f (\u044f\u0432\u043d\u043e \u2013 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0427\u0451\u0440\u0447\u0430):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{align}\\lambda x:A.M;\\\\\\end{align}\" alt=\"\\begin{align}\\lambda x:A.M;\\\\\\end{align}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c5\/f60\/eb2\/9c5f60eb2f10bcd4c632e7c1a4162b76.svg\" width=\"93\" height=\"22\"\/><\/p>\n<p>\u0422\u0438\u043f \u0441\u0430\u043c\u043e\u0433\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cda\/3ea\/8d0\/cda3ea8d027c4dec1bff7c71827ec420.svg\" width=\"11\" height=\"17\"\/>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e (\u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x\" alt=\"x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5c\/098\/ae2\/e5c098ae235290dbe93d752216c3af69.svg\" width=\"11\" height=\"12\"\/> \u0438 \u0442\u0435\u043b\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"M\" alt=\"M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a5\/73c\/2ac\/3a573c2ac97d7d3295ed37c52eec65fe.svg\" width=\"20\" height=\"17\"\/>.<\/p>\n<p>\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda^{\\rightarrow}\" alt=\"\\lambda^{\\rightarrow}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b63\/c8d\/131\/b63c8d131b2c1ac6259fa53d5c677f0b.svg\" width=\"27\" height=\"18\"\/> (\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430) \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A7%D1%91%D1%80%D1%87%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0427\u0451\u0440\u0447\u0430<\/a>, \u0442.\u0435. :<\/p>\n<pre><code class=\"scala\">type Zero \u00a0 \u00a0 = Any  \u00a0 \u00a0 \u00a0 \/\/ ? \u2245 Any type One \u00a0 \u00a0 \u00a0= Any => Any \/\/ ? \u2245 Any => Any type Bool \u00a0 \u00a0 = Any => One \/\/ ? \u2245 Any => Any => Any type Natural \u00a0= One => One \/\/ \u2115 \u2245 (Any => Any) => Any => Any - \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e \u041f\u0435\u0430\u043d\u043e<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">val trueWay: Bool = happyWay => unhappyWay => happyWay val one  : Natural = suc => z =>         suc(z) val three: Natural = suc => z => suc(suc(suc(z)))  \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f def calc(cond: Bool, trueNum: Natural, falseNum: Natural) =   cond(trueNum)(falseNum).asInstanceOf[Natural] val result = calc(trueWay, three, one)  \/\/ \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043a Int32 def natToInt(num: Natural): Int =   num(_.asInstanceOf[Int] + 1)(0).asInstanceOf[Int]   natToInt(result) \/\/ 3<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u2013 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda2\" alt=\"\\lambda2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1b5\/8de\/190\/1b58de1905da7f67bcdb01419103f752.svg\" width=\"21\" height=\"17\"\/> (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_F\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430 F<\/a>). \u0422\u0435\u043f\u0435\u0440\u044c \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/61b\/bd4\/629\/61bbd4629c85d3feb962fc279cc8068e.svg\" width=\"11\" height=\"17\"\/>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u0438 \u0442\u0438\u043f\u043e\u0432\u044b\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{align}\\lambda A:\\star.\\; \\lambda x:A.\\; M\\end{align}\" alt=\"\\begin{align}\\lambda A:\\star.\\; \\lambda x:A.\\; M\\end{align}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d75\/e71\/f07\/d75e71f077fe6786ae1efccb6f3ca0f0.svg\" width=\"159\" height=\"22\"\/><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/059\/cf3\/2e3\/059cf32e3c2a1f7aae28e9fe9baa3ab9.svg\" width=\"10\" height=\"12\"\/> \u2013 \u044d\u0442\u043e &#171;\u0442\u0438\u043f \u0442\u0438\u043f\u0430&#187;. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda2\" alt=\"\\lambda2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d7\/80d\/723\/1d780d72345345436a6eefdb7091c469.svg\" width=\"21\" height=\"17\"\/> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c <em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/em>. \u0412 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0435 \u041a\u0430\u0440\u0440\u0438-\u0425\u043e\u0432\u0430\u0440\u0434\u0430 \u0442\u0438\u043f\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\u043c, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda2\" alt=\"\\lambda2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/798\/26f\/801\/79826f80181da7abf36c75a928aa38c2.svg\" width=\"21\" height=\"17\"\/> \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Second-order_logic\" rel=\"noopener noreferrer nofollow\">\u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430<\/a> (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0434\u0432\u043e\u0439\u043a\u0430 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438).<\/p>\n<p>\u0412 Scala 3 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"scala\">\/\/ \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 def foldWithContext[A, B](aWithContext: WithContext[A])(folder: (A, String) => B)   = folder(aWithContext._1, aWithContext._2)  \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 val foldWithContextVal   : [A, B] => WithContext[A] => ((A, String) => B) => B \/\/ \u0442\u0438\u043f      \u2200A,B. WithContext[A] \u2192 ((A, String) \u2192 B) \u2192 B   = foldWithContext                                     \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u03bbA,B. \u03bba:WithContext[A]. \u03bbf:(A,String) \u2192 B. f(a._1, a._2)<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lambda_cube#%CE%BB%CF%89\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/a> <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\\omega\" alt=\"\\lambda\\omega\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b73\/bed\/cb7\/b73bedcb7f8b4f0c139c59913679e6b6.svg\" width=\"23\" height=\"17\"\/>  (\u0438\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"F\\omega\" alt=\"F\\omega\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/00d\/b42\/154\/00db42154383ca7651c1a36c49d4b09b.svg\" width=\"26\" height=\"17\"\/>) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 <em>\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0438\u043f\u044b<\/em>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/302\/958\/ce0\/302958ce038562d764398bb3c3ee9649.svg\" width=\"11\" height=\"17\"\/>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"List = \\lambda A.\\; \\forall B.\\; (A\\rightarrow B\\rightarrow B)\\rightarrow B\\rightarrow B;\\\\\" alt=\"List = \\lambda A.\\; \\forall B.\\; (A\\rightarrow B\\rightarrow B)\\rightarrow B\\rightarrow B;\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f6\/230\/f90\/7f6230f9002387230b3d80c94e9abd8b.svg\" width=\"697\" height=\"41\"\/><\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 (\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435) \u0442\u0438\u043f\u044b:<\/p>\n<pre><code class=\"scala\">type List = [A] =>> [B] => (A => B => B) => B => B  def emptyList[A]: List[A] =   [B] => (aggr: A => B => B) => (start: B) => start  def append[A](lst: List[A], a: A): List[A] =   [B] => (aggr: A => B => B) => (start: B) => aggr(a)(lst(aggr)(start))  def fold[A, B](lst: List[A], start: B, aggr: A => B => B): B = lst(aggr)(start)  val myList = append(append(append(emptyList[Int], 1), 2), 3) \/\/ [1, 2, 3]  fold(myList, \"\u0441\u043f\u0438\u0441\u043e\u043a:\", i => _ + \" \" + i)                    \/\/ \"\u0441\u043f\u0438\u0441\u043e\u043a: 1 2 3\"<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2013 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 (\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c) \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0412\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0442\u0438\u043f\u0430\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u0432\u0430\u043d\u0442\u043e\u0440 &#171;<em>\u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e<\/em>&#171;, \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 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c<\/em>. \u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0440 &#171;<em>\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442<\/em>&#171;, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c<\/em> \u2013 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p><a class=\"anchor\" name=\"subtyping_polymorphism\" id=\"subtyping_polymorphism\"><\/a><\/p>\n<h4>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<pre><code class=\"scala\">trait Person { val name: String def sayHello(): String } case class Fran\u00e7ais(name: String)\u00a0extends Person { def sayHello() = \"Bon apr\u00e8s-midi!\" } case class \u0420\u0443\u0441\u0441\u043a\u0438\u0439 (name: String)\u00a0extends Person { def sayHello() = \"\u0417\u0434\u0430\u0440\u043e\u0432!\" }  def dialogWith(person: Person) =   println(\"\u041f\u0440\u0438\u0432\u0435\u0442, \" + person.name)   println(person.sayHello())              \/\/ 1  val \u0424\u0440\u0430\u043d\u0446\u0443\u0430 = Fran\u00e7ais(\"Fran\u00e7ois\") val \u0412\u0430\u0441\u0438\u043b\u0438\u0439 = \u0420\u0443\u0441\u0441\u043a\u0438\u0439(\"\u0412\u0430\u0441\u044f\") dialogWith(\u0424\u0440\u0430\u043d\u0446\u0443\u0430); dialogWith(\u0412\u0430\u0441\u0438\u043b\u0438\u0439)  \/\/ 2<\/code><\/pre>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0442\u0443\u0442 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 <code>1<\/code>, \u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>sayHello<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u0442\u0438\u043f\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&#187;, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>person<\/code>. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0442\u0438\u043f\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u0442\u0435\u0440\u043c\u0430\u043c \u044f\u0437\u044b\u043a\u0430 (\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c), \u0430 \u043d\u0435 \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.<\/p>\n<p>\u0414\u0430, \u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e, \u0438 \u043a\u043b\u0430\u0441\u0441 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <em>\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/em> \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u0445 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445. \u041d\u043e, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 (\u0442\u0435\u0440\u043c\u0430) <code>person<\/code> \u0442\u0438\u043f <code>Person<\/code> \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u0432 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 <code>1<\/code> \u0438\u0434\u0451\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043c\u0435\u0442\u043e\u0434\u0443 <code>sayHello<\/code> \u0442\u0440\u0435\u0439\u0442\u0430 <code>Person<\/code>, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0443\u0442 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043d\u0435\u0442. \u0422\u043e, \u0447\u0442\u043e \u201c\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u201d \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043d\u0430\u0441 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041d\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 <code>2<\/code> \u2013 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u0438\u043f\u0430 <code>Person<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432, <code>Fran\u00e7ais<\/code> \u0438 <code>\u0420\u0443\u0441\u0441\u043a\u0438\u0439<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <em>\u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/em> \u043e\u0442 \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043a \u0441\u0443\u043f\u0435\u0440\u0442\u0438\u043f\u0443 \u2013 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u041e\u041e\u041f-\u0448\u043d\u044b\u0439 <em>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432<\/em>! \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>dialogWith<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 <code>Person<\/code>, \u0442\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>Fran\u00e7ais<\/code> \u0438 <code>\u0420\u0443\u0441\u0441\u043a\u0438\u0439<\/code> \u0432 \u044d\u0442\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code>person<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e &#171;\u041e\u041e\u041f-\u0448\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0435\u0439&#187;, \u0432\u0435\u0434\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u2013 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <code>person<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d\u043d\u043e\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0430 \u0443\u0436\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043b\u0435\u0436\u0430\u0442 <em>\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b<\/em> \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u044f\u0432\u043d\u043e, \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 (\u0438 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438)<\/p>\n<pre><code class=\"scala\">case class Person(val name: String, val sayHello: Unit => String) val \u0424\u0440\u0430\u043d\u0446\u0443\u0430 = Person(       \"Fran\u00e7ois\",           ()   => \"Bon apr\u00e8s-midi!\") val \u0412\u0430\u0441\u0438\u043b\u0438\u0439 = Person(       \"\u0412\u0430\u0441\u044f\",               ()   => \"\u0417\u0434\u0430\u0440\u043e\u0432!\")<\/code><\/pre>\n<p>\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u043e \u0443\u0436\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044f \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 <em>\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 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438<\/em> &#8212; \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0435\u0435. \u041d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0441\u0430\u043c\u0438 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430<\/em>, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#ad_hoc_polymorphism\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"variance\" id=\"variance\"><\/a><\/p>\n<h4>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>\u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432? \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0435\u0435, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0435\u0440\u043c \u0442\u0438\u043f\u0430 <code>List[String]<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0430 <code>List[Any]<\/code>? \u041e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 Scala (\u0434\u0430 \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445) \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u043e \u0432\u043e\u0442, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0435\u0440\u043c \u0442\u0438\u043f\u0430 <code>List[Any]<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e <code>List[String]<\/code>, \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>List[String]<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c <code>List[Any]<\/code> \u0438, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f! \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 <code>List<\/code> <em>\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438<\/em> \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430:<\/p>\n<pre><code class=\"scala\">type Func[X] = X => Int \/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 Function1  \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \"\u043f\u0440\u0438\u0437\u044b\u0432\" \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430 summon[ \u00a0 \u00a0 String \u00a0&lt;:&lt; \u00a0 \u00a0 \u00a0Any] summon[List[String] &lt;:&lt; List[Any]] summon[Func[Any]    &lt;:&lt; Func[String]] \/\/ \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 String \u0438 Any! <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 <code>[X] =>> X => Int<\/code> \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443! \u041f\u0440\u0438\u0447\u0451\u043c, \u0443 \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u0442\u0438\u043f\u0430<code>[X] =>> Int => X<\/code> \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043d\u043e\u0432\u044c \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u201c\u043f\u0440\u044f\u043c\u043e\u0439\u201d!<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0438\u0432\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0443 \u043d\u0430\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"scala\">class Test[A](val a: A)  summon[Test[String] &lt;:&lt; Test[Any]]    \/\/ \u043e\u0448\u0438\u0431\u043a\u0430! summon[Test[Any] \u00a0 \u00a0&lt;:&lt; Test[String]] \/\/ \u043e\u0448\u0438\u0431\u043a\u0430!<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0447\u0451\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/variances.html\" rel=\"noopener noreferrer nofollow\"><s>\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/s><\/a> \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>List<\/code> \u0438 <code>Function<\/code> (<code>=><\/code>) \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435:<\/p>\n<pre><code class=\"scala\">type List    [+A]     = scala.collection.immutable.List[A] type Function[-A, +B] = Function1[A, B]<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0437\u043d\u0430\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0438\u0434 <em>\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/em>:<\/p>\n<ul>\n<li>\n<p><code>+<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u0443\u044e <em>\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0443\u044e<\/em> \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438,<\/p>\n<\/li>\n<li>\n<p><code>-<\/code> \u2013 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e, <em>\u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0443\u044e<\/em>,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0442 \u0437\u043d\u0430\u0447\u043a\u0430 \u2013 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u2013 <em>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/em>.<\/p>\n<\/li>\n<\/ul>\n<p>(\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.)<\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Test<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>A<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u044f\u043a\u043e \u2013 \u0438 \u043a\u0430\u043a \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 (\u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e), \u0438 \u043a\u0430\u043a \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u044f <code>a<\/code> (\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e). \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0439 \u0442\u0438\u043f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u044d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c<\/em>. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043f\u0435\u0440\u0435\u0434 <code>A<\/code> \u043f\u043b\u044e\u0441 \u0438\u043b\u0438 \u043c\u0438\u043d\u0443\u0441 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 <code>contravariant type A occurs in covariant position in type A of value a<\/code> (&#171;\u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0442\u0438\u043f A \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0439 <em>\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em> \u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 a&#187;). \u041e \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u0443\u0442 \u0438\u0434\u0451\u0442 \u0440\u0435\u0447\u044c?<\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0432\u0438\u0434\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044f &#171;\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0438&#187; <code>=><\/code>:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f (\u0437\u043d\u0430\u043a <code>-<\/code>), \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0438<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f (\u0437\u043d\u0430\u043a <code>+<\/code>), \u0435\u0441\u043b\u0438 \u0441\u043f\u0440\u0430\u0432\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e?. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c:<\/p>\n<pre><code class=\"scala\">type Cont[+X] = (X => Int) => Int summon[Cont[String] &lt;:&lt; Cont[Any]]<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>X<\/code> \u0441\u0442\u043e\u0438\u0442 \u043b\u0435\u0432\u0435\u0435 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u0435\u043b\u043e\u043a \u2013 \u0434\u0432\u0430\u0436\u0434\u044b \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e!<\/p>\n<p>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b, \u0438 \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0438\u043f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 <code>Nil \u2245 List[Nothing]<\/code>. \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>Nothing<\/code> (\u0441\u043c. \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 <code>Nothing<\/code> \u043a <em>\u043b\u044e\u0431\u043e\u043c\u0443<\/em> \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0438\u043f\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u0430 <code>Nil<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <code>List[A]<\/code> \u043f\u0440\u0438 <em>\u043b\u044e\u0431\u043e\u043c<\/em> <code>A<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 (\u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435). \u0422\u043e\u0433\u0434\u0430, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u2013 \u044d\u0442\u043e \u0442\u043e, \u043a\u0430\u043a \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f &#171;\u043f\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c&#187; \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432. \u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/778\/38b\/ef0\/77838bef071c74cb0f4c890d097c6f6b.png\" alt=\"\u0422\u0438\u043f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 F[_] \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043c\u0435\u0436\u0434\u0443 A \u0438 B \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0438\u043f\u044b F[A] \u0438 F[B]. \u0421\u0438\u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0435\u0440\u0442\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430: \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438.\" title=\"\u0422\u0438\u043f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 F[_] \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043c\u0435\u0436\u0434\u0443 A \u0438 B \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0438\u043f\u044b F[A] \u0438 F[B]. \u0421\u0438\u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0435\u0440\u0442\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430: \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438.\" width=\"797\" height=\"532\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/778\/38b\/ef0\/77838bef071c74cb0f4c890d097c6f6b.png\"\/><\/p>\n<div><figcaption>\u0422\u0438\u043f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>F[_]<\/code> \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043c\u0435\u0436\u0434\u0443 <code>A<\/code> \u0438 <code>B<\/code> \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0438\u043f\u044b <code>F[A]<\/code> \u0438 <code>F[B]<\/code>. \u0421\u0438\u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0435\u0440\u0442\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430: \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e: <a href=\"https:\/\/scalajobs.com\/blog\/demystifying-variance-in-scala\/\" rel=\"noopener noreferrer nofollow\">Demystifying Variance in Scala<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"subtyping_bounds\" id=\"subtyping_bounds\"><\/a><\/p>\n<h4>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u041e\u041e\u041f-\u0448\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <em>\u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/em>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0430\u043c\u0438 \u043a \u0442\u0438\u043f\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"scala\">trait SupperClass { val i: Int } case class SubClass(i: Int) extends SupperClass  def someFunc(x: SupperClass) = \u00a0 x.i + 3  val sub = SubClass(5) someFunc(sub) \/\/ \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0442\u0443\u0442<\/code><\/pre>\n<p>\u042d\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u044f\u0432\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <em>\u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/em> (\u0442.\u0435. \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0435\u0451 \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e), \u043d\u043e \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"F_{&lt;:}\" alt=\"F_{&lt;:}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db4\/2af\/0fa\/db42af0fa6239d499909e36bc8bc3eef.svg\" width=\"29\" height=\"20\"\/>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0432 Scala. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430 <code>someFunc<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u044f\u0432\u043d\u043e:<\/p>\n<pre><code class=\"scala\">def someFunc[A &lt;: SupperClass](x: A) = \u00a0 x.i + 3 \/\/ \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"F_{&lt;:}\" alt=\"F_{&lt;:}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4c6\/e54\/4a9\/4c6e544a9d5ba057e7dd94d92bbaba6f.svg\" width=\"29\" height=\"20\"\/> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043a \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \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, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0449\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c <em>\u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/em>:<\/p>\n<pre><code class=\"scala\">trait SupperClass { val i: Int } case class SubClass(i: Int, s: String) extends SupperClass \/\/ \u0432 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 s val sub: SubClass = SubClass(5, \"string\")  def extractInt1[A &lt;: SupperClass](x: A): (A,           Int) = (x, x.i) def extractInt2(x  : SupperClass      ): (SupperClass, Int) = (x, x.i)  \/\/ \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \"_1\" \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043a\u043e\u0440\u0442\u0435\u0436\u0430  extractInt1(sub)._1.s \/\/ \"string\" extractInt2(sub)._1.s \/\/ !!! \u041e\u0428\u0418\u0411\u041a\u0410 !!! \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0442\u0443\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e s!<\/code><\/pre>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>extractInt2<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0442\u0438\u043f\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0435\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u2013 \u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e <em>\u0434\u043e \u0442\u043e\u0433\u043e<\/em>, \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>\u0412\u044b\u0448\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u044c\u0438\u043c-\u0442\u043e \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c \u2013 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435, <em>\u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0438\u043f\u0430<\/em>. \u041d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 <em>\u043d\u0438\u0436\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0438\u043f\u0430<\/em>: \u0437\u0430\u043f\u0438\u0441\u044c <code>X >: SubType<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>X<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u0442\u0438\u043f\u043e\u043c \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0433\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>SubType<\/code>. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/lower-type-bounds.html\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Scala<\/a>.<\/p>\n<p>\u0412 \u0440\u0430\u043d\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Scala \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435, <em>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/em>. \u0417\u0430\u043f\u0438\u0441\u044c <code>A &lt;% SomeType<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0435\u043a\u043e\u0435 <em>\u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/em> \u043e\u0442 \u0442\u0438\u043f\u0430 <code>A<\/code> \u043a \u0442\u0438\u043f\u0443 <code>SomeType<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u0430 <code>SomeType<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0442\u0438\u043f\u0430 <code>A<\/code>. \u0422\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u044f\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<code>List[String] &lt;: List[Any]<\/code>) \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 (<code>Short &lt;: Int<\/code>) \u2013 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0435\u044f\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"scala\">given def intToSubClass(i: Int) \/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Int => SubClass   = SubClass(i, \"\u043d\u0435\u0447\u0442\u043e\")  def getString[A &lt;% SubClass](a: A) = a.s  getString(5) \/\/ \"\u043d\u0435\u0447\u0442\u043e\"<\/code><\/pre>\n<p>\u0412 Scala 3 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0443\u0431\u0440\u0430\u043b\u0438, \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 <code>&lt;%<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u2013 \u043e \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 &#8212; \u044d\u0442\u043e <em>\u043f\u043e\u0442\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f<\/em>: \u0441\u0447\u0438\u0442\u0430\u0435\u043c <code>F<\/code> \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c <code>G<\/code>, \u0435\u0441\u043b\u0438 <code>F[X]<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c <code>G[X]<\/code> \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>X<\/code>. \u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u0438\u0432\u0438\u043b\u0441\u044f, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 Scala:<\/p>\n<pre><code class=\"scala\">def headOption[F &lt;: [X] =>> Iterable[X], A](fa: F[A]): Option[A] = fa.headOption \u00a0  headOption(List(5))          \/\/ Some(5) headOption(Option(\"\u0441\u0442\u0440\u043e\u043a\u0430\")) \/\/ Some(\"\u0441\u0442\u0440\u043e\u043a\u0430\") headOption(Map(1.2 -> true)) \/\/ Some((1.2, true))<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0d2\/95a\/bb2\/0d295abb2c384e3d96e4f862d2411f7b.svg\" width=\"11\" height=\"17\"\/>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0440\u044f\u0432\u043e. \u041a \u0441\u043b\u043e\u0432\u0443, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 <code>F[_] &lt;: List[_]<\/code>.<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0442\u043e\u0447\u0435\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043d\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 <em>\u0442\u0438\u043f\u044b \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/em> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u0430 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u201cF-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u201c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0438\u043f. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">trait F[U &lt;: F[U]] class C extends F[C]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0440\u0435\u0439\u0442 <code>F<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>U<\/code>, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u0435\u0440\u0445\u0443 <code>F[U]<\/code> \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u201c<em>F-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435<\/em>\u201d. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>C<\/code> <em>\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f<\/em> \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0440\u0435\u0439\u0442\u0435 <code>F[C]<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f <code>C<\/code>. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f F-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0411\u0440\u044e\u043a\u0430 \u041a\u0430\u0439\u0441\u0435\u043d\u0430 <a href=\"https:\/\/brieuckaisin.hashnode.dev\/f-bounded-polymorphism-in-scala\" rel=\"noopener noreferrer nofollow\">F-bounded polymorphism in Scala<\/a>. \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f F-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430.<\/p>\n<p><a class=\"anchor\" name=\"higher_tyeps\" id=\"higher_tyeps\"><\/a><\/p>\n<h3>\u0422\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/h3>\n<p><a class=\"anchor\" name=\"hkt\" id=\"hkt\"><\/a><\/p>\n<h4>Higher Kinded Types<\/h4>\n<p>\u0412 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a<\/p>\n<ul>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 &#171;\u043f\u0440\u043e\u0441\u0442\u044b\u0435&#187; \u043d\u0435\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0432\u0451\u0440\u0442\u043a\u0430),<\/p>\n<\/li>\n<li>\n<p>\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0434\u043d\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0432\u0440\u043e\u0434\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439!<\/p>\n<p>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\/\u0438\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D1%88%D0%B5%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\"><em>\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432<\/em><\/a> (higher-order functions). \u0422\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e &#171;\u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438&#187; \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 (\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430), \u043d\u043e \u0438 \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, &#171;\u043f\u043e\u0440\u044f\u0434\u043e\u043a&#187; \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0448\u0435 \u0447\u0435\u043c, \u0443 \u0442\u0435\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u043c\u0430\u0440\u043a\u0430 \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u0434\u0430\u0436\u0435 \u0432 \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e, \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e.  \u041d\u043e \u0441\u0430\u043c \u0442\u0435\u0440\u043c\u0438\u043d &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432&#187; \u0432\u043e\u0448\u0451\u043b \u0432 \u043e\u0431\u043e\u0440\u043e\u0442, \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 <em>\u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445<\/em> \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c <em>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/em> \u2013 &#171;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/a>&#171;.<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043e, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u2013 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u043e\u0434\u043d\u0438 \u0442\u0438\u043f\u044b \u0432 \u0434\u0440\u0443\u0433\u0438\u0435. \u0418\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"F_2\" alt=\"F_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a2a\/a09\/a1d\/a2aa09a1d45c5bf7e02bdbbfb13b914a.svg\" width=\"21\" height=\"19\"\/> &#171;\u043f\u0440\u043e\u0441\u0442\u044b\u0435&#187; \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439) \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"F_\\omega\" alt=\"F_\\omega\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d7b\/2c8\/f7b\/d7b2c8f7b678fe4a0cef83633a3da2f9.svg\" width=\"23\" height=\"20\"\/> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442\u0441\u044f <em>\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u043d\u0430 \u0442\u0438\u043f\u0430\u0445<\/em> \u2013 <strong>higher kinded types<\/strong> (HKT).<\/p>\n<p>\u0421\u043b\u043e\u0432\u043e &#171;kind&#187; \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u043a\u0430\u0439\u043d\u0434<\/strong> \u2013 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f, \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p><strong>\u0441\u043e\u0440\u0442<\/strong> \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u044d\u043a\u043b\u0435\u043a\u0442\u0438\u043a\u0443 \u0432\u0440\u043e\u0434\u0435 &#171;\u0442\u0438\u043f\u043e\u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0441\u043e\u0440\u0442\u0430&#187;;<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u0438\u0434<\/strong> \u0442\u0438\u043f\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f &#171;\u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430&#187;;<\/p>\n<\/li>\n<li>\n<p><strong>\u0440\u043e\u0434<\/strong> \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0432 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u0435\u0441\u0442\u043d\u0443\u044e, \u043d\u043e \u0441\u0442\u0430\u0432\u0448\u0443\u044e \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0439, &#171;\u0432\u044b\u0441\u043e\u043a\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u044c&#187;.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b <em>\u0432\u0438\u0434\u044b<\/em> \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e <em>\u0440\u043e\u0434\u0430<\/em> ?.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"scala\">type Option = [A] =>> Unit | A type Reader = [Dep] =>> [A] =>> Dep => A type Functor = [F[_]] =>> [A, B] => (A => B) => (F[A] => F[B]) type TaglessFinalProgram = [Algebra[_[_]]] =>> [A] =>> [F[_]] => Algebra[F] => F[A]<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>Reader<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e \u0441\u0443\u0442\u0438, <code>Reader<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>Functor<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0443\u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type FOpt = Functor[Option] \/\/type FReader1 = Functor[Reader] \u00a0 \u00a0 \u00a0 \/\/ \u043d\u0435\u043b\u044c\u0437\u044f! type FReader2 = Functor[Reader[Int]] \/\/type FInt = Functor[Int] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ \u043d\u0435\u043b\u044c\u0437\u044f! type OptInt = Option[Int] \/\/type OptReader1 = Option[Reader] \u00a0 \u00a0 \u00a0\/\/ \u043d\u0435\u043b\u044c\u0437\u044f! \/\/type OptReader2 = Option[Reader[Int]] \/\/ \u043d\u0435\u043b\u044c\u0437\u044f! type OptReader3 = Option[Reader[Int][String]] type OptF = Option[Functor[Option]] \/\/type Reader1 = Reader[Int] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ \u043d\u0435\u043b\u044c\u0437\u044f! type Reader2 = Reader[Int][String]<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u0440\u0430\u0441\u043e\u043a \u0432 \u043e\u0434\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2013 \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0438\u043f\u044b \u043d\u0435 \u0432\u0441\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435)). \u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u044c. \u0412\u0435\u0434\u044c \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>Option<\/code> \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0438\u043f\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043f\u0438\u0441\u0430\u0442\u044c \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043a\u0430\u043a \u043c\u0435\u0442\u043a\u0438? \u041a\u0430\u043a\u043e\u0439 \u0441\u043c\u044b\u0441\u043b \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c <code>val opt: Option<\/code>?<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u043a\u0430\u0437\u0430\u0432, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0432 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>opt<\/code> \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>val intOpt: getType[Int](opt) = Some(42)<\/code>. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u044f\u0437\u044b\u043a\u0430, \u0438, \u0445\u043e\u0442\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u0430\u043a Scala \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 (\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u0430\u0445) \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0445\u043e\u0436\u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u043e\u2026<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u043a \u0442\u0435\u0440\u043c\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430 <strong>\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435<\/strong> <strong>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u0430\u043c\u0438<\/strong>! (\u0421\u043c. \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/stackoverflow.com\/questions\/54620961\/can-type-constructors-be-considered-as-types-in-functional-programming-languages\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.) \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u0438\u043f\u0430\u043c\u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430). \u0412 Scala \u0435\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u043a\u0430\u043a \u043c\u0435\u0442\u043a\u0438, \u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 &#8212; \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043f\u0440\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/Michaelt293\/higher-kinded-data\" rel=\"noopener noreferrer nofollow\">Higher-kinded data in Scala<\/a>,<\/p>\n<\/li>\n<li>\n<p>GitHub-\u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/Katrix\/DataPrism\" rel=\"noopener noreferrer nofollow\">DataPrizm<\/a> (\u0438 <a href=\"https:\/\/bora.uib.no\/bora-xmlui\/bitstream\/handle\/11250\/3073826\/Generic-programming-using-Higher-Kinded-Data.pdf\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/a>, \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435).<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"higher_logic\" id=\"higher_logic\"><\/a><\/p>\n<h4>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432<\/h4>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u041a\u0430\u0440\u0440\u0438-\u0425\u043e\u0432\u0430\u0440\u0434\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f<\/p>\n<pre><code class=\"scala\">type Product = [A, B] =>> (A, B)<\/code><\/pre>\n<p>\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u043a\u0430\u043a<br \/> &#171;<em>\u0414\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <\/em><code>A<\/code> \u0438 <code>B<\/code> \u0438\u0437 \u0438\u0445 \u043e\u0431\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0430-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f <code>A \u00d7 B<\/code>.&#187;<\/p>\n<p> \u0418\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u043e\u0435 \u044d\u0442\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<br \/> &#171;<em>\u0414\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u0439 <\/em><code>A<\/code> \u0438 <code>B<\/code> \u0438\u0437 \u0438\u0445 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u044f <code>A \u2227 B<\/code>.&#187;<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0440\u0430 (&#171;\u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e&#187;, \u0438\u043b\u0438 &#171;\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442&#187;) \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438\/\u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 &#171;\u0432\u044b\u0441\u043e\u043a\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u044c&#187; \u0442\u0438\u043f\u0430, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0432\u044b\u0441\u0448\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043b\u043e\u0433\u0438\u043a\u0438. \u0421\u0432\u044f\u0437\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441 \u043b\u043e\u0433\u0438\u043a\u0430\u043c\u0438 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0434\u0430\u043b\u043e\u0441\u044c <em>\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/em> \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 \u0442\u0438\u043f\u043e\u043c \u0435\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0421 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 (\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0442\u0438\u043f) \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f. \u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0449\u043d\u043e\u0439 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u043b\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 &#8212; \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u041a\u0430\u0440\u0440\u0438-\u0425\u043e\u0432\u0430\u0440\u0434\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. (\u0414\u0430, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0440\u0430\u043d\u0435\u0435, \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438, \u0430 \u0442\u043e \u0438 \u0432\u043e\u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439, \u043d\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.)<\/p>\n<p><a class=\"anchor\" name=\"type_kind\" id=\"type_kind\"><\/a><\/p>\n<h4>\u0412\u0438\u0434 \u0442\u0438\u043f\u0430<\/h4>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e \u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u043d\u044b\u043c <strong>\u0432\u0438\u0434\u0430\u043c \u0442\u0438\u043f\u0430<\/strong> (type kinds). \u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u043e\u0432 \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442: <code>A<\/code>, <code>F[_]<\/code>, <code>Algebra[_[_]]<\/code>. \u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 &#8212; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412\u0438\u0434 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u043e\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1cf\/32c\/0fe\/1cf32c0fe170a309c9a31143c2879a4f.svg\" width=\"10\" height=\"12\"\/>. \u0412\u0438\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow\\star\" alt=\"\\star\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/453\/d8a\/7c7\/453d8a7c7c90429f2fe15eddc372f80e.svg\" width=\"49\" height=\"13\"\/>. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438. \u0412 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 ML (\u0442\u043e\u043c \u0436\u0435 Haskell) \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u044d\u0442\u043e \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c \u0442\u0438\u043f\u043e\u0432. \u0412 Scala \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 \u2013 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e:<\/p>\n<blockquote>\n<p><em>\u0412\u0438\u0434 \u0442\u0438\u043f\u0430 &#8212; \u044d\u0442\u043e \u043b\u0438\u0431\u043e \u0432\u0438\u0434 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d6d\/f99\/49e\/d6df9949ed1897c1faf0979927bd9dc8.svg\" width=\"10\" height=\"12\"\/>), \u043b\u0438\u0431\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\rightarrow\" alt=\"\\rightarrow\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/166\/e9e\/56a\/166e9e56ae17c752b6fa0544d3c07bf6.svg\" width=\"19\" height=\"13\"\/>) \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e) \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0438\u0434 \u0442\u0438\u043f\u0430.<\/em><\/p>\n<\/blockquote>\n<p>\u0421\u0442\u0440\u0435\u043b\u043a\u0430, \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0443\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0438\u0434 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow(\\star\\rightarrow\\star)\" alt=\"\\star\\rightarrow(\\star\\rightarrow\\star)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e48\/273\/605\/e4827360519f613587c53e77010e8a2b.svg\" width=\"104\" height=\"22\"\/> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0432\u0438\u0434\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow\\star\\rightarrow\\star\" alt=\"\\star\\rightarrow\\star\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ff2\/5d8\/f1f\/ff25d8f1f137faf769430af36f2dcbf3.svg\" width=\"89\" height=\"13\"\/>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a76\/9db\/f9f\/a769dbf9f9e81a326324186603709607.svg\" width=\"10\" height=\"12\"\/>. \u041c\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0432\u0438\u0434 \u0442\u0438\u043f\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u0445, \u201c\u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0445\u201d \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u0430 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u0412\u0438\u0434 \u0442\u0438\u043f\u0430<\/p>\n<\/th>\n<th>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0434\u0430<\/p>\n<\/th>\n<th>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0434\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75b\/cd7\/064\/75bcd70646d579d7d37b941db28eebab.svg\" width=\"10\" height=\"12\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>A<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Int<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow\\star\" alt=\"\\star\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b6e\/358\/120\/b6e3581206311ef04e5722956bcfa9c9.svg\" width=\"49\" height=\"13\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>F[_]<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Option<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\\rightarrow\\star\\rightarrow\\star\" alt=\"\\star\\rightarrow\\star\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e8\/36b\/eb1\/2e836beb1de2cfd959f2dabf760a3dd9.svg\" width=\"89\" height=\"13\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>F[_][_]<\/code>, \u043d\u043e Scala \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430((<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Reader<\/code> \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(\\star\\rightarrow\\star)\\rightarrow\\star\" alt=\"(\\star\\rightarrow\\star)\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f0\/55d\/c3c\/5f055dc3c647242f5a0ab407dfa4b62a.svg\" width=\"104\" height=\"22\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Alg[_[_]]<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Functor<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"((\\star\\rightarrow\\star)\\rightarrow\\star)\\rightarrow\\star\" alt=\"((\\star\\rightarrow\\star)\\rightarrow\\star)\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce9\/30b\/67d\/ce930b67d769716022ee27572eaaa4e3.svg\" width=\"159\" height=\"22\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Prog[_[_[_]]]<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>TaglessFinalProgram<\/code> \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(\\star,\\star)\\rightarrow\\star\" alt=\"(\\star,\\star)\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/622\/f78\/c21\/622f78c21a02a35a53b1bb35543d75fd.svg\" width=\"83\" height=\"22\"\/><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>M[_, _]<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Map<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0415\u0449\u0451 \u0440\u0430\u0437 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0438\u0434 \u0442\u0438\u043f\u0430 <code>Functor<\/code> \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435. \u0412 Scala \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0440\u043e\u0434\u0435 <code>[A, B] => ...<\/code> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 <em>\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f<\/em> \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f <code>Functor<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(\\star\\rightarrow\\star)\\rightarrow\\star\" alt=\"(\\star\\rightarrow\\star)\\rightarrow\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/79e\/985\/97d\/79e98597d708b05115ef7d5fdd476cb4.svg\" width=\"104\" height=\"22\"\/>.<\/p>\n<p>\u0412 <a href=\"https:\/\/docs.scala-lang.org\/ru\/scala3\/book\/taste-repl.html\" rel=\"noopener noreferrer nofollow\">Scala REPL<\/a> (\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438) \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0438\u0434 \u0442\u0438\u043f\u0430, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>:kind<\/code> (\u0441 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>-v<\/code>). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>Functor<\/code> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/typelevel.org\/cats\/\" rel=\"noopener noreferrer nofollow\">Cats<\/a> \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code>scala> :kind -v cats.Functor cats.Functor's kind is X[F[A]] (* -> *) -> * This is a type constructor that takes type constructor(s): a higher-kinded type.<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>:kind<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 (\u0442\u0440\u0435\u0439\u0442\u0430\u043c\u0438). \u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u0438\u043b\u0438 \u03bb-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u044b\u043b\u0430 \u0438\u0434\u0435\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <em>\u0442\u0438\u043f\u0430 \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430<\/em> ?:<\/p>\n<pre><code class=\"scala\">type Kind type GetKind[A &lt;: AnyKind] \/\/ &lt;: Kind   \/\/ (\u043f\u0440\u043e AnyKind \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435) def instantinate[K &lt;: Kind]: Kind = ??? \/\/ \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 def toString(kind: Kind): String = ???  \/\/ \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 \"(\u22c6 \u2192 \u22c6) \u2192 \u22c6\"<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0442\u0438\u043f <code>Kind<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">opaque type \u22c6 = Unit                    \/\/ \u0432\u0438\u0434 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 type -->[K1, K2] = (K1, K2)             \/\/ \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043a\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 type Kind = \u22c6 | (Kind --> Kind)         \/\/ \u0442\u0438\u043f \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 (\u0431\u0435\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432)<\/code><\/pre>\n<p>\u041d\u043e, \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437-\u0437\u0430 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0442\u0438\u043f\u043e\u0432. \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u043d\u0451\u0432\u0440\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u044f, \u043d\u043e, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0437\u0430\u0432\u0435\u043b\u0438 \u0432 \u0442\u0443\u043f\u0438\u043a. <a href=\"https:\/\/github.com\/lampepfl\/dotty\/blob\/main\/tests\/pos\/anykind.scala\" rel=\"noopener noreferrer nofollow\">\u0427\u0435\u0433\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e<\/a> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043d\u0435\u044f\u0432\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <em>\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430<\/em> \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u0430.  \u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Scala \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0443\u043c\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p><a class=\"anchor\" name=\"type_calculus\" id=\"type_calculus\"><\/a><\/p>\n<h4>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0442\u0438\u043f. \u0418 \u044d\u0442\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432!<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type \u22a5        = Unit      \/\/ \u0442\u0438\u043f \"\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0438\u0434\u0430\" type \u22a4        = [A] =>> A \/\/ \u0442\u0438\u043f \"\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430\"  type IfFalse \u00a0= [False] =>> [True] =>> False type IfTrue \u00a0 = [False] =>> [True] =>> True  type Zero \u00a0 \u00a0 = [Z] =>> [Succ[_]] =>> Z type One \u00a0 \u00a0 \u00a0= [Z] =>> [Succ[_]] =>> Succ[Z] type Two   \u00a0 \u00a0= [Z] =>> [Succ[_]] =>> Succ[Succ[Z]] type Three \u00a0 \u00a0= [Z] =>> [Succ[_]] =>> Succ[Succ[Succ[Z]]]<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u043e \u0441 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0432 Scala \u0434\u043e\u043b\u0436\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0442\u0438\u043f\u043e\u0432 \u043e\u0434\u043d\u043e\u043c\u0443 &#171;\u0442\u0438\u043f\u0443&#187; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f <em>\u0432\u0438\u0434\u043e\u043c \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432<\/em>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split}Zero    &amp;:&amp;&amp;\\;\\; \\star\\\\One     &amp;:&amp;&amp;\\;\\; \\star\\rightarrow\\star\\\\Bool    &amp;:&amp;&amp;\\;\\; \\star\\rightarrow\\star\\rightarrow\\star\\hspace{2cm} (\\text{\u0442\u0443\u0442 \u0438 \u043d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435})\\\\Natural &amp;:&amp;&amp;\\;\\; (\\star\\rightarrow\\star)\\rightarrow\\star\\rightarrow\\star\\\\Pair    &amp;:&amp;&amp;\\;\\; (\\star\\rightarrow\\star\\rightarrow\\star)\\rightarrow\\star\\\\\\end{split}\" alt=\"\\begin{split}Zero    &amp;:&amp;&amp;\\;\\; \\star\\\\One     &amp;:&amp;&amp;\\;\\; \\star\\rightarrow\\star\\\\Bool    &amp;:&amp;&amp;\\;\\; \\star\\rightarrow\\star\\rightarrow\\star\\hspace{2cm} (\\text{\u0442\u0443\u0442 \u0438 \u043d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435})\\\\Natural &amp;:&amp;&amp;\\;\\; (\\star\\rightarrow\\star)\\rightarrow\\star\\rightarrow\\star\\\\Pair    &amp;:&amp;&amp;\\;\\; (\\star\\rightarrow\\star\\rightarrow\\star)\\rightarrow\\star\\\\\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ba3\/3fc\/9a9\/ba33fc9a96209a1d5eafbe3e2b5d87d3.svg\" width=\"583\" height=\"126\"\/><\/p>\n<p>\u041d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0443\u0442 \u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0427\u0451\u0440\u0447\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 <strong>\u0440\u0430\u043d\u0435\u0435<\/strong>, \u043f\u0440\u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0418 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0438\u0434 \u0442\u0438\u043f\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043f\u043e \u0441\u0443\u0442\u0438, \u0442\u0438\u043f\u043e\u043c \u0442\u0438\u043f\u0430 (\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/496\/dbb\/7b7\/496dbb7b7b942c449bde99f59cf701fd.svg\" width=\"10\" height=\"12\"\/> \u2013 \u044d\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u201c\u0431\u0435\u0437\u0442\u0438\u043f\u043e\u0432\u044b\u0439\u201d \u0432\u0438\u0434)!<\/p>\n<p>\u0422\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0430 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f\u044b \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Succ<\/code> \u043a \u0442\u0438\u043f\u0443 <code>Z<\/code>.  \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a <em>\u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435<\/em>, \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u043a \u0442\u0435\u0440\u043c\u043e\u0432, \u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0438\u043f \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u0438\u043d\u044b \u2013 \u043f\u0440\u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0434\u043b\u0438\u043d\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0418, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u042d\u0442\u0430 \u0438\u0434\u0435\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 habr-\u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/725462\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e 8 \u0444\u0435\u0440\u0437\u044f\u0445 \u043d\u0430 \u0442\u0440\u0451\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 Scala \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0442\u0438\u043f\u044b, \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430<\/a>.<\/p>\n<p>\u041f\u043b\u044e\u0441\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e <em>\u0447\u0438\u0441\u0442\u043e\u0442\u0430<\/em> \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \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. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u2013 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u201c\u043d\u0435\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u201d \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c. \u041d\u043e \u044d\u0442\u043e \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043c\u0438\u043d\u0443\u0441\u043e\u043c, \u0432\u0435\u0434\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043b\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0434\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0441\u0432\u0435\u0440\u0445\u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430, \u043c\u043e\u043d\u0438\u0442\u043e\u0440, \u043f\u0430\u043c\u044f\u0442\u044c, \u0411\u0414, web-\u0441\u043b\u0443\u0436\u0431\u044b \u0438 \u0442.\u043f.) \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u043d\u0438\u044e. \u0422\u0430\u043a \u0432\u043e\u0442 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0432\u0435\u0440\u0445\u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/raasahsan.com\/posts\/typelevel-church-numerals-in-scala-3\/\" rel=\"noopener noreferrer nofollow\">Typelevel Church Numerals in Scala 3<\/a> \u2013 \u0442\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0442\u0438\u043f\u044b \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 &#171;\u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b&#187;.<\/p>\n<\/li>\n<li>\n<p>habr-\u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/776798\/\" rel=\"noopener noreferrer nofollow\">Scala: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/apocalisp.wordpress.com\/2010\/06\/08\/type-level-programming-in-scala\/\" rel=\"noopener noreferrer nofollow\">Type-Level Programming in Scala<\/a> \u0438\u0437 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 <a href=\"https:\/\/apocalisp.wordpress.com\/\" rel=\"noopener noreferrer nofollow\">Apocalisp<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 <em>Type-Level Programming in Scala<\/em> \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 <a href=\"https:\/\/blog.rockthejvm.com\/\" rel=\"noopener noreferrer nofollow\">Rock the JVM Blog<\/a> (<a href=\"https:\/\/blog.rockthejvm.com\/type-level-programming-scala-3\/\" rel=\"noopener noreferrer nofollow\">Part I<\/a>, <a href=\"https:\/\/blog.rockthejvm.com\/type-level-programming-part-2\/\" rel=\"noopener noreferrer nofollow\">Part II<\/a>, <a href=\"https:\/\/blog.rockthejvm.com\/type-level-programming-part-3\/\" rel=\"noopener noreferrer nofollow\">Part III<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 <em>Meta-Programming with Scala<\/em>: (<a href=\"https:\/\/michid.wordpress.com\/2008\/04\/18\/meta-programming-with-scala-part-i-addition\/\" rel=\"noopener noreferrer nofollow\">Part I<\/a>, <a href=\"https:\/\/michid.wordpress.com\/2008\/07\/30\/meta-programming-with-scala-part-ii-multiplication\/\" rel=\"noopener noreferrer nofollow\">Part II<\/a>, <a href=\"https:\/\/michid.wordpress.com\/2008\/08\/27\/meta-programming-with-scala-part-iii-partial-function-application\/\" rel=\"noopener noreferrer nofollow\">Part III<\/a>);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f <a href=\"https:\/\/scala-slick.org\/talks\/scalaio2014\/Type-Level_Computations.pdf\" rel=\"noopener noreferrer nofollow\">Type-Level Computations in Scala<\/a>;<\/p>\n<\/li>\n<li>\n<p>pdf-\u0441\u0442\u0430\u0442\u044c\u044f \u041b\u0443\u043a\u0438 \u041a\u0430\u0440\u0434\u0435\u043b\u043b\u0438 <a href=\"http:\/\/www.lucacardelli.name\/Papers\/TypefulProg.pdf\" rel=\"noopener noreferrer nofollow\">Typeful Programming<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 SKI \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432: <\/p>\n<ul>\n<li>\n<p>\u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/michid.wordpress.com\/2010\/01\/29\/scala-type-level-encoding-of-the-ski-calculus\/\" rel=\"noopener noreferrer nofollow\">Scala type level encoding of the SKI calculus<\/a> \u0438\u0437 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e <a href=\"https:\/\/michid.wordpress.com\/\" rel=\"noopener noreferrer nofollow\">\u0431\u043b\u043e\u0433\u0430 \u041c\u0438\u0447\u0438\u0434\u0430<\/a>;<\/p>\n<\/li>\n<li>\n<p>GitHub-\u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/tarao\/lambda-scala\" rel=\"noopener noreferrer nofollow\">Type level lambda calculus in Scala<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"kind_polymorphism\" id=\"kind_polymorphism\"><\/a><\/p>\n<h4>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432<\/h4>\n<p>\u0415\u0441\u0442\u044c \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <em>\u0440\u0430\u0437\u043d\u043e\u0433\u043e<\/em> \u0432\u0438\u0434\u0430? \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u2013 \u044d\u0442\u043e \u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c), \u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>identity<\/code> \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445), \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435). \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC#%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D1%80%D0%BE%D0%B4%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c\u0438 \u043f\u043e \u0432\u0438\u0434\u0443<\/a> \u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432 (kind polimorphism) \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/em> (higher kinded polymorpism), \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u043f\u043e <em>\u0442\u0438\u043f\u0430\u043c \u0442\u0438\u043f\u043e\u0432<\/em>. \u042f\u0437\u044b\u043a Haskell \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0432\u0438\u0434\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043b\u044f \u043d\u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 <a href=\"https:\/\/ghc.gitlab.haskell.org\/ghc\/doc\/users_guide\/exts\/poly_kinds.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432<\/a>.  \u0412 Scala 3 \u0436\u0435 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 <a href=\"https:\/\/docs.scala-lang.org\/scala3\/reference\/other-new-features\/kind-polymorphism.html\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/a>, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <code>&lt;: AnyKind<\/code>:<\/p>\n<pre><code class=\"scala\">type SomeTypeConstructor[A &lt;: AnyKind]<\/code><\/pre>\n<p>\u0418\u0437 \u0437\u0430 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <code>AnyKind<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0442\u0438\u043f\u043e\u043c, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0430\u044f \u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0443 \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432\u0438\u0434\u043e\u0432 \u0432 Scala \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 <code>AnyKind<\/code>. \u041d\u0430 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Scala \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<blockquote>\n<p>(todo: insert good concise example)<\/p>\n<\/blockquote>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>AnyKind<\/code>:<\/p>\n<ul>\n<li>\n<p>\u0432\u043d\u0443\u0442\u0440\u0438 Scala, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/github.com\/lampepfl\/dotty\/blob\/5bb6f0ddf6eca05dfb2d224be6ccddecb07700c9\/library\/src\/scala\/quoted\/Quotes.scala#L1812\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/lampepfl\/dotty\/blob\/main\/tests\/pos\/anykind.scala\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438<\/a> \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432\u0438\u0434\u043e\u0432, \u043f\u043e \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0440\u0430\u043d\u0435\u0435 \u0441\u0441\u044b\u043b\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0432\u0435 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u043d\u043e\u0438\u0434\u0430, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u043f\u043e \u0432\u0438\u0434\u0430\u043c \u0442\u0438\u043f\u0430: <a href=\"https:\/\/gist.github.com\/s5bug\/dc9b765ee2ba11cab3d7bcfc2a0a44dc\" rel=\"noopener noreferrer nofollow\">gist s5bug<\/a>, <a href=\"https:\/\/gist.github.com\/mandubian\/dfd670f7740f47a1a2a7b662f828aac6\" rel=\"noopener noreferrer nofollow\">gist mandubian<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0449\u0451 \u043e\u0434\u0438\u043d <a href=\"https:\/\/github.com\/sellout\/category-parametric-talk\/blob\/master\/scala-io.org#anykind\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u0430\u0434\u044b, \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u043d\u043e\u0438\u0434, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0439 \u043f\u043e \u0432\u0438\u0434\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codegolf.stackexchange.com\/a\/210062\" rel=\"noopener noreferrer nofollow\">Implement SKI combinator calculus<\/a> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>AnyKind<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 StackOverflow <a href=\"https:\/\/stackoverflow.com\/questions\/75494119\/scala-3-kind-polymorphism-and-anykind-type-any-code-example\" rel=\"noopener noreferrer nofollow\">Scala 3. Kind polymorphism and AnyKind type &#8212; any code example?<\/a><\/p>\n<\/li>\n<li>\n<p>\u0421\u043b\u0430\u0439\u0434\u044b \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/milessabin.com\/talks\/2018\/11\/08\/codemesh-ldn-2018\/\" rel=\"noopener noreferrer nofollow\">Adding kind-polymorphism to the Scala programming language<\/a><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 <a href=\"https:\/\/contributors.scala-lang.org\/t\/proposal-to-add-kind-polymorphism-to-the-language\/2958\" rel=\"noopener noreferrer nofollow\">Proposal to add kind polymorphism to the language<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p><a class=\"anchor\" name=\"type_universes\" id=\"type_universes\"><\/a><\/p>\n<h4>\u0412\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 \u2013 \u044d\u0442\u043e \u0442\u0438\u043f\u044b \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430. \u041d\u043e \u201c\u0442\u0438\u043f\u044b \u0442\u0438\u043f\u043e\u0432\u201d \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u0438 \u0431\u044b\u0442\u044c \u0442\u0438\u043f\u0430\u043c\u0438 \u2013 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 <em>\u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0443 \u0416\u0438\u0440\u0430\u0440\u0430<\/em>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0430\u0434\u043e\u043a\u0441 \u0416\u0438\u0440\u0430\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0430\u0440\u0430\u0434\u043e\u043a\u0441 \u0416\u0438\u0440\u0430\u0440\u0430 \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u2013 \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%A0%D0%B0%D1%81%D1%81%D0%B5%D0%BB%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430 \u0420\u0430\u0441\u0441\u0435\u043b\u0430<\/a>, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e, \u0447\u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432<\/a> \u0441\u0430\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c. \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u043f\u043e \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0443 \u0416\u0438\u0440\u0430\u0440\u0430, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e pdf-\u0441\u0442\u0430\u0442\u044c\u044f \u0425\u0451\u0440\u043a\u0435\u043d\u0441\u0430 <a href=\"https:\/\/www.cs.cmu.edu\/~kw\/scans\/hurkens95tlca.pdf\" rel=\"noopener noreferrer nofollow\">A Simplification of Girard\u2019s Paradox<\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0442\u0435\u043e\u0440\u0438\u044e \u0442\u0438\u043f\u043e\u0432, \u0434\u0435\u043b\u0430\u044f \u0435\u0451 \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0439. \u0412\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f <em>\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/em>: \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u0442\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u201c\u043e\u0431\u044b\u0447\u043d\u043e\u0439\u201d \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0\" alt=\"U_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a52\/3cd\/857\/a523cd85795fec2a9ae1b6ebd25000bf.svg\" width=\"22\" height=\"20\"\/>, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0432\u0441\u0435 \u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u0443\u0436\u0435 \u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_1\" alt=\"U_1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a00\/adf\/e59\/a00adfe596be979f009170c62782460e.svg\" width=\"22\" height=\"19\"\/>. \u0412 Haskell \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438\u0437 \u043e\u0431\u0435\u0438\u0445 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0441\u0430\u043c\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u0432\u0432\u0435\u0434\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u0430 \u2013 \u0432\u0438\u0434\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430! \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u0438\u0435 <em>\u0432\u0438\u0434\u044b \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u0432\u0441\u0451 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430 \u0416\u0438\u0440\u0430\u0440\u0430, \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_2\" alt=\"U_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd9\/6fd\/688\/dd96fd68897b5f32f57ec4718445febd.svg\" width=\"22\" height=\"19\"\/>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0,\\;U_1,\\;U_2,\\;\\ldots\" alt=\"U_0,\\;U_1,\\;U_2,\\;\\ldots\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f19\/14d\/7ba\/f1914d7baaa6fb207d32df7f4144edbf.svg\" width=\"130\" height=\"20\"\/><\/p>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e <em>\u0432\u0441\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e<\/em> (\u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0439 \u0434\u0430\u043b\u0435\u0435). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432\u0438\u0434 \u0442\u0438\u043f\u043e\u0432, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0442\u0438\u043f\u0443 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u0430\u043b\u0451\u043a\u0438\u0445 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439. \u0422\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (<a href=\"https:\/\/agda.readthedocs.io\/en\/latest\/language\/universe-levels.html\" rel=\"noopener noreferrer nofollow\">Agda<\/a>, <a href=\"https:\/\/coq.inria.fr\/refman\/addendum\/universe-polymorphism.html\" rel=\"noopener noreferrer nofollow\">Coq<\/a>) \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u201c<strong>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445<\/strong>\u201c.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0438\u0434\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0442\u0438\u043f\u044b \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2013 \u0432\u044b\u0448\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u2013 <em>\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/em> \u0441 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u0430\u0447\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{-1}\" alt=\"U_{-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/119\/35f\/6f6\/11935f6f6fd2e839010b5e95b3c9c1a1.svg\" width=\"33\" height=\"21\"\/>. \u041e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439, \u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u201c\u0442\u0438\u043f\u044b\u201d \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442, \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u043d\u043e \u0442\u0430\u043a \u043b\u0438 \u044d\u0442\u043e??).<\/p>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u043e, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0442 \u0442\u0438\u043f\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043a \u0442\u0438\u043f\u0443 \u0434\u0440\u0443\u0433\u043e\u0439. \u0418 \u0445\u043e\u0442\u044f \u0432 Sacla \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0430\u043b\u0451\u043a\u0438\u043c\u0438 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 <code>Anykind<\/code>, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0432\u043e\u0442\u043e\u0447\u0438\u043d\u044b \u043c\u0435\u0436\u0434\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{-1}\" alt=\"U_{-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0e7\/118\/35e\/0e711835e0e88416bbee1f114793274d.svg\" width=\"33\" height=\"21\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0\" alt=\"U_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee9\/eec\/7bd\/ee9eec7bd99cbd427879123abeb2de5a.svg\" width=\"22\" height=\"20\"\/>, \u0442\u043e \u0431\u0438\u0448\u044c \u043c\u0435\u0436\u0434\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0\" alt=\"U_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bdc\/f91\/37b\/bdcf9137bc3e445144755955fadec1ec.svg\" width=\"22\" height=\"20\"\/> \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{-1}\" alt=\"U_{-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43f\/699\/0c3\/43f6990c3f7d43d83362a32251801f19.svg\" width=\"33\" height=\"21\"\/> \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2013 \u044d\u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0442\u0438\u043f\u044b-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">val doubleA                  \/\/ \u0447\u0435\u0440\u0432\u043e\u0442\u043e\u0447\u0438\u043d\u0430     : [A] => A      => (A, A)  \/\/ \u0438\u0437 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435-\u0444\u0443\u043d\u043a\u0446\u0438\u044e     = [A] => (a: A) => (a, a)  \/\/ \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0432\u0430\u0436\u043d\u0430      val doubleInt                \/\/ \u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     : Int => (Int, Int)        \/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430     = doubleA[Int]             \/\/ \u0432\u0436\u0443\u0445!<\/code><\/pre>\n<p><a href=\"https:\/\/docs.scala-lang.org\/ru\/scala3\/book\/types-dependent-function.html\" rel=\"noopener noreferrer nofollow\">\u0412 Scala \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442<\/a> \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f \u2013 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0442\u0438\u043f\u044b! \u041e, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0434\u0443\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <strong>\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b<\/strong>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"scala\">trait IHaveAType { type Type; val v: Type }     \/\/ \u0442\u0440\u0435\u0439\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u043b\u0435\u043d\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f! val valWithInt:    IHaveAType =                 \/\/ \u0447\u0435\u0440\u0432\u043e\u0442\u043e\u0447\u0438\u043d\u0430 1   new IHaveAType { type Type = Int;    val v = 42 } val valWithString: IHaveAType =                 \/\/ \u0447\u0435\u0440\u0432\u043e\u0442\u043e\u0447\u0438\u043d\u0430 2   new IHaveAType { type Type = String; val v = \"\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0430\u044f\" }    val doubleDep \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0422\u0418\u041f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0417\u041d\u0410\u0427\u0415\u041d\u0418\u042f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430     : (carier: IHaveAType) => (carier.Type, carier.Type)       \/\/ \u0432\u0436\u0443\u0445 \u0442\u0443\u0434\u0430!   = (carier: IHaveAType) => doubleA[carier.Type](carier.v)   \/\/ \u0432\u0436\u0443\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e!  val stringsPair: (String, String) = doubleDep(valWithString) \/\/ (\"\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0430\u044f\", \"\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0430\u044f\") val intsPair:    (Int, Int)       = doubleDep(valWithInt)    \/\/ (42, 42) \/\/               \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438! \/\/               \u0430 \u0432\u0441\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0442\u0438\u043f valWithInt \u0445\u0438\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f: IHaveAType { type Type = Int }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 <code>\u0432\u0436\u0443\u0445 \u0442\u0443\u0434\u0430!<\/code> \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>carier.Type<\/code> \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{-1}\" alt=\"U_{-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a0\/7cf\/670\/4a07cf6700565068e02514b48e88eeb8.svg\" width=\"33\" height=\"21\"\/> \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0\" alt=\"U_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3af\/047\/bbd\/3af047bbdc2fa0a7ed4ee4fb55111457.svg\" width=\"22\" height=\"20\"\/>, \u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. <a href=\"https:\/\/www.youtube.com\/watch?v=63syJfNoDPI\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> \u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 Scala \u2013 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0438 \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u044a\u0451\u043c\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0430\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439, \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0438\u043f\u043e\u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_0\" alt=\"U_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6b2\/38b\/793\/6b238b793a82bbc231a731394108cf7e.svg\" width=\"22\" height=\"20\"\/>. \u041d\u043e \u0447\u0430\u0449\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 <em>\u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432\u0441\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435<\/em> \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438: <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{-1}:U_{0}:U_{1}:U_{2}:\\ldots\" alt=\"U_{-1}:U_{0}:U_{1}:U_{2}:\\ldots\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b8\/d3d\/2fe\/5b8d3d2fe879d80bf6e57c1422ad37f5.svg\" width=\"185\" height=\"21\"\/> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f <em>\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u0430\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445<\/em>. \u0410 \u0432\u043e\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"U_{\\infty}\" alt=\"U_{\\infty}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/47b\/6da\/e4a\/47b6dae4a53cc577b30f5021fa2741c9.svg\" width=\"29\" height=\"20\"\/>, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0439 \u0432 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u044d\u0442\u043e \u0432\u0441\u0451 \u0432\u044b\u0434\u0443\u043c\u043a\u0438 \u043a\u0438\u043d\u043e\u0448\u043d\u0438\u043a\u043e\u0432!) \u0438\u0437-\u0437\u0430 \u0432\u0441\u0451 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430 \u0416\u0438\u0440\u0430\u0440\u0430.<\/p>\n<p>\u0415\u0449\u0451 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0442\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/cs.stackexchange.com\/questions\/13285\/universes-in-dependent-type-theory\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430<\/a> <a href=\"https:\/\/math.stackexchange.com\/questions\/4637779\/unnested-universes-in-type-theory\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0432\u0435\u0442\u043e\u0432<\/a> \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u043a\u0443\u043c\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ncatlab.org\/nlab\/show\/type+universe\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0430 nLab;<\/p>\n<\/li>\n<li>\n<p>pdf-\u0441\u0442\u0430\u0442\u044c\u0438: <\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/www2.math.uu.se\/~palmgren\/universe.pdf\" rel=\"noopener noreferrer nofollow\">On Universes in Type Theory<\/a>,<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/pdf\/2212.03284.pdf\" rel=\"noopener noreferrer nofollow\">Type Theory with Explicit Universe Polymorphism<\/a>,-<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ncatlab.org\/ufias2012\/files\/LuoUniverse.pdf\" rel=\"noopener noreferrer nofollow\">Notes on Universes in Type Theory<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043a \u0434\u0430\u043b\u0451\u043a\u0438\u043c \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0442\u0430\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0446\u0430. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/807485\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u043d\u0430\u0448\u0443 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u0443\u044e, \u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438 \u0442\u0438\u043f\u0430\u043c.<\/p>\n<\/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\/807467\/\"> https:\/\/habr.com\/ru\/articles\/807467\/<\/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<figure class=\"full-width\">\n<div><figcaption>\u0422\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (<em>generics<\/em>) \u2013 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 1 (\u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f) <\/p>\n<ul>\n<li>\n<p><a href=\"#generic_types\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_constructors\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#polymorphic_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#higher_tyeps\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#type_classes\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#container_types\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 3<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/#container_programming\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043a\u0430\u043a \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/807495\/#subcategories_of_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (\u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f)<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#generic_types\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#motivation\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_mehtods\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_classes\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#type_constructors\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#type_operations\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432 Scala<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_functions\" rel=\"noopener noreferrer nofollow\">\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#generic_recursion\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#polymorphic_types\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#polymorphism_kinds\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#universal_polymorphism\" rel=\"noopener noreferrer nofollow\">\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u03bb-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping_polymorphism\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#variance\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#subtyping_bounds\" rel=\"noopener noreferrer nofollow\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#higher_tyeps\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#hkt\" rel=\"noopener noreferrer nofollow\">Higher Kinded Types<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#higher_logic\" rel=\"noopener noreferrer nofollow\">\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_kind\" rel=\"noopener noreferrer nofollow\">\u0412\u0438\u0434 \u0442\u0438\u043f\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_calculus\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#kind_polymorphism\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432\u0438\u0434\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_universes\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h3>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 Scala-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432, Tagless Final \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0424\u041f-\u0448\u043d\u044b\u0445 \u0432\u043a\u0443\u0441\u043d\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043f\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u0447\u0438\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0438\u0445 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0432\u0443\u0447\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: &#171;\u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b?&#187;. \u0412 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0435 \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0438 \u043f\u043e\u043e\u0431\u0435\u0449\u0430\u043b, \u0447\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u044d\u0442\u0443 \u0442\u0435\u043c\u0443.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0442\u0435\u043c\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u0430. \u0422\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043b\u043e \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0441\u0442\u0432\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0432\u0448\u0435\u0433\u043e, \u043d\u043e \u043d\u0435 \u0443\u0431\u0435\u0436\u0434\u0430\u043b\u043e \u043c\u0435\u043d\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u044f\u0442\u0441\u044f \u043e\u0431\u0449\u0435\u0435 \u0441\u043b\u043e\u0432\u0430, \u043c\u043e\u043b, \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u044e\u0442 &#171;\u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&#187;, &#171;\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e&#187; (\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u0442\u0438\u043f\u0430\u043c-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0442.\u043f.), &#171;\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c&#187; \u0438 \u043f\u0440\u043e\u0447\u0430\u044f &#171;\u0432\u043e\u0434\u0430&#187;. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445) <em>\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/em> \u043d\u0430\u0434 \u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438&#8230; \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u043e \u043c\u043d\u043e\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 \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0438 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b?<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0431\u044b\u0432\u0430\u044e\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u201c\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b\u201d \u2013 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u043e \u0432\u0441\u0451\u043c \u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u044d\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u043e\u043c \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u043e\u0431\u0437\u043e\u0440 \u0442\u0435\u043c\u044b \u0441 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (\u0441\u043c. \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e).<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b\u0431\u0440\u0430\u043d \u044f\u0437\u044b\u043a Scala 3. \u0414\u0430, \u043c\u0430\u043b\u043e \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 (HKT), \u0438\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043a\u0430\u043a \u0432 Scala, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0442\u0443\u0442 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u044d\u0442\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e. \u0412\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u0434\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"generic_types\" id=\"generic_types\"><\/a><\/p>\n<h3>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h3>\n<p><a class=\"anchor\" name=\"motivation\" id=\"motivation\"><\/a><\/p>\n<h4>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438\u0441\u044c), \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 web-\u0441\u0435\u0440\u0432\u0435\u0440 (\u0442\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a). \u0412 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u044b\u0431\u0440\u043e\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u043e\u0442\u043b\u043e\u0432. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0435\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u0435\u043d \u2013 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 &#171;\u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u0435&#187; \u0438\u0441\u0445\u043e\u0434\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u044f\u0437\u044b\u043a, \u0432\u0432\u043e\u0434\u044f \u043d\u043e\u0432\u044b\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0440\u043e\u0434\u0435 <code>try\/catch<\/code>.<\/p>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B2%D1%81%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F!-,%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%92%D0%BE%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D0%B2%D1%88%D0%B8%D1%81%D1%8C%20%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5%D0%BC%20%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE\" rel=\"noopener noreferrer nofollow\"><em>\u0441\u0443\u043c\u043c\u044b \u0442\u0438\u043f\u043e\u0432<\/em><\/a> \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u044f\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u043c\u0443 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \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 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430  \u2013 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0438\u043f  \u0438\u0437 \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432-\u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445:<\/p>\n<pre><code class=\"scala\">def foldToString(itemOrNot: ItemType | NotFound)( \/\/ ItemType + NotFound   itemToString: ItemType => String,  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   notFoundResult:   Unit => String   \/\/ \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 ): String =    itemOrNot match     \/\/ \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e ItemType!     case it: ItemType => itemToString(it)     case _: NotFound  => notFoundResult()<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>ItemType | NotFound<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u043e\u0439 \u0442\u0438\u043f\u0430 <code>ItemType<\/code> \u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%B8%D0%B7%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D0%B0%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%3A-,%D0%95%D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D0%B0,-%D0%98%D0%BD%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B2%D0%BE%D0%B7%D0%BD%D0%B8%D0%BA%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\"><em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em><\/a> <code>NotFound<\/code>.<\/p>\n<p>\u0418 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438\u0437 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <code>ItemType<\/code>, \u0438\u043b\u0438 <code>Response<\/code> \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043d\u043e <em>\u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/em> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0441\u0443\u043c\u043c\u044b \u2013 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>fold<\/code> \u2013 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0438 \u043e\u0442 <code>ItemType<\/code>, \u0438\u043b\u0438 <code>Response<\/code>! \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fold<\/code> \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0442\u0438\u043f\u0430 <code>ItemType<\/code> (\u0438\u043b\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, <code>Response<\/code>) \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e &#171;\u0442\u0438\u043f\u0430-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&#187; \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c&#8230;<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0441\u0443\u043c\u043c\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043c\u0435\u0442\u043e\u0434 \u0438\u0449\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445, \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435, \u043e\u0442\u043a\u0443\u0434\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d. \u0422\u0443\u0442 \u0443\u0436\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%BF%D1%80%D0%BE%20%D0%B8%D0%B7%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D1%8B%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2.-,%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%95%D1%81%D0%BB%D0%B8%20%D0%BD%D0%B0%20%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B5\" rel=\"noopener noreferrer nofollow\"><em>\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432<\/em><\/a> <code>Content \u00d7 Source<\/code>, \u0433\u0434\u0435 \u0442\u0438\u043f <code>Content<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0430 <code>Source<\/code> \u2013 \u044d\u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>String<\/code>. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u0442\u0438\u043f\u044b <code>Content<\/code> \u0438 <code>Source<\/code> \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>Content<\/code> \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"scala\">def foldToInt(contentWithSource: Conent &amp; Source)( \/\/ Conent \u00d7 Source   handler: Conent => Source => Int  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ): Int =    \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a handler \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 source   handler(contentWithSource: Conent)(contentWithSource: Source)<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u2013 &#171;\u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439&#187;. \u0415\u0441\u043b\u0438 \u0432 \u043d\u0435\u043a\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u0438\u043f\u0430 <code>Service<\/code>, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u0435 &#171;\u0431\u0438\u0437\u043d\u0435\u0441<strong>\u043e<\/strong>\u0432\u044b\u043c\u0438&#187; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 (\u0438\u043b\u0438 \u0436\u0435 \u043f\u043e-\u041e\u041e\u041f-\u0448\u043d\u043e\u043c\u0443, \u0447\u0443\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u2013 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0433\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, &#171;\u0436\u0430\u0434\u043d\u044b\u0439&#187; \u0437\u0430\u0445\u0432\u0430\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f: <code>(Service, BusinessParam) => Result<\/code>. &#171;\u0416\u0430\u0434\u043d\u043e\u043c\u0443&#187; \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u043b\u0435\u043d\u0438\u0432\u044b\u0439&#187;, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Service<\/code>, \u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f: <code>BusinessParam => (Service => Result)<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%D0%BC%D0%B8.-,%D0%9A%D0%B0%D1%80%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,-%D0%A7%D1%82%D0%BE%D0%B1%D1%8B%20%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B5\" rel=\"noopener noreferrer nofollow\"><em>\u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/em><\/a> \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438! \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u043e, <em>\u0432\u044b\u043d\u0435\u0441\u044f \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/em>, \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u2013 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#:~:text=%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9!-,%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2,-%D0%A0%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D0%BC%20%D1%81%D1%83%D0%BC%D0%BC%D1%83%20%D0%B4%D0%B2%D1%83%D1%85\" rel=\"noopener noreferrer nofollow\"><em>\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em><\/a> <code>Service => Result<\/code> \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 <code>Result<\/code>, \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"scala\">def foldToResult(   resultByService: Service => Result)( \/\/ Result\u02e2\u1d49\u02b3\u1d5b\u2071\u1d9c\u1d49   service: Service                     \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 ): Result =    resultByService(service)             \/\/ \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Result - \u043d\u0435 \u0432\u0430\u0436\u043d\u043e!<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0432\u0440\u043e\u0434\u0435 <code>Result<\/code>, <code>Content<\/code>, <code>Response<\/code>, <code>ItemType<\/code>) \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u2013 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043d\u043e <em>\u043f\u0430\u0442\u0442\u0435\u0440\u043d<\/em> \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c! \u0411\u044b\u043b\u043e \u0431\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043d\u043e\u0432\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u2013 <em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/em>.<\/p>\n<p><a class=\"anchor\" name=\"generic_mehtods\" id=\"generic_mehtods\"><\/a><\/p>\n<h4>\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h4>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0435\u0439 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. <a href=\"https:\/\/docs.scala-lang.org\/ru\/tour\/polymorphic-methods.html\" rel=\"noopener noreferrer nofollow\">\u0412 Scala<\/a> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b-\u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0432 \u043a\u0440\u0443\u0433\u043b\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0430 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445. \u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b <code>fold<\/code>, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435:<\/p>\n<pre><code class=\"scala\">def foldToString[ItemType](itemOrNot: ItemType | NotFound)( \/\/ ItemType + NotFound   itemToString: ItemType => String,  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   notFoundResult:   Unit => String   \/\/ \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 ): String = ???                      \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435  def foldToInt[Conent](contentWithSource: Conent &amp; Source)( \/\/ Conent \u00d7 Source   handler: Conent => Source => Int  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ): Int = ???                        \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435  def foldToResult[Result](resultByService: Service => Result)( \/\/ Result\u02e2\u1d49\u02b3\u1d5b\u2071\u1d9c\u1d49   service: Service                  \/\/ \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 ): Result = ???                     \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">val doubleOrNot: Double | NotFound = 4.2 val str = foldToString[Double](doubleOrNot)(d => s\"double: $d\", _ => \"no double found\") \/\/                     \u2191\u2191\u2191\u2191\u2191\u2191 - \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e (\u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)  val intOrNot: Int | NotFound = 42 val str = foldToString(intOrNot)(i => s\"int: $i\", _ => \"no int found\") \/\/                   \u2191\u2191 - \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438<\/code><\/pre>\n<p>\u0422\u0443\u0442<\/p>\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-373532","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373532","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=373532"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373532\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=373532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=373532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=373532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}