{"id":265844,"date":"2015-09-17T14:31:03","date_gmt":"2015-09-17T10:31:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=265844"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=265844","title":{"rendered":"FP \u043d\u0430 Scala: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440?"},"content":{"rendered":"<p>       \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0439 \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \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, \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0442\u0430\u043a \u0438 \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u00ab\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0443\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443\u00bb.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438 \u044d\u0437\u043e\u0442\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b Scala \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0434\u0432\u0430 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f  <\/p>\n<ul>\n<li><b>\u043a\u043e-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b><\/li>\n<li><b>\u043a\u043e\u043d\u0442\u0440\u0430-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b><\/li>\n<\/ul>\n<p> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c   <\/p>\n<ul>\n<li><b>Exponential (Invariant) Functor<\/b>, <b>BiFunctor<\/b>, <b>ProFunctor<\/b><\/li>\n<li><b>Applicative Functor<\/b>, <b>Arrow<\/b>, <b>Monad \/ Co-Monad<\/b><\/li>\n<li><b>Monad Transformers<\/b>, <b>Kleisli<\/b>, <b>Natural Transformations<\/b><\/li>\n<\/ul>\n<p>  \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0440\u043e\u043b\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 (<b><a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.Option\">Option<\/a>, <a href=\"http:\/\/www.scala-lang.org\/files\/archive\/nightly\/docs\/library\/index.html#scala.util.Try\">Try<\/a>, <a href=\"http:\/\/www.scala-lang.org\/files\/archive\/nightly\/docs\/library\/index.html#scala.concurrent.Future\">Future<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.collection.immutable.List\">List<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/2.10.2\/index.html#scala.util.parsing.combinator.Parsers$Parser\">Parser<\/a><\/b>) \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 (<b><a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.math.Ordering\">Ordering<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.math.Equiv\">Equiv<\/a><\/b>) \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scala. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u0440 Scala, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \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 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 <b>\u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <a href=\"https:\/\/www.udemy.com\/scala-for-java-developers-ru\/?couponCode=HABR-COVARIANT-FUNCTOR\">\u00abScala for Java Developers\u00bb<\/a><\/b> (\u0432\u0438\u0434\u0435\u043e + \u0442\u0435\u0441\u0442\u044b).<\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#1\">\u041f\u0440\u043e \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#2\">\u041f\u0440\u043e \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 Haskell<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#3\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#4\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#5\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#6\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#7\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#10\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#11\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#12\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#13\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#20\">\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/a><\/li>\n<\/ul>\n<p>  <a name=\"habracut\"><\/a><a name=\"1\"><\/a>  <\/p>\n<h3>\u041f\u0440\u043e \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438<\/h3>\n<p>  \u041f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0441\u044f\u043a\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435:   <\/p>\n<ol>\n<li>\u042f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0438\u0434\u0438\u043e\u043c\/\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: \u0432 \u041e\u041e\u041f \u0438\u0437\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430, \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430, \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438, \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f,\u2026 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f GoF, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c Java =&gt; Scala \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043d\u0435 \u0443\u0447\u0430\u0442 \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 (generics of higher kind, path dependent types, type classes, macroses, &#8230;) \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043a \u0447\u0435\u043c\u0443 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>  \u0410 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0438\u0434\u0442\u0438 \u0440\u0435\u0447\u044c \u043f\u0440\u043e \u00ab\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00bb (\u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043c\u043e\u043d\u0430\u0434\u0430, \u043c\u043e\u043d\u043e\u0438\u0434, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, &#8230;) \u2014 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a\u0438 \u0438\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 (\u0442\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430) \u0438 \u043e\u0434\u043d\u0438\u043c \u043c\u0430\u0445\u043e\u043c \u00ab\u043e\u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0441 \u0434\u043e\u0441\u043a\u0438\u00bb. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0444\u0430\u043d\u0430\u0442\u0438\u043a\u0438 \u0441\u0435\u043a\u0442\u044b \u0421\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u0435\u0439 \u041f\u0440\u0438\u0448\u0435\u0441\u0442\u0432\u0438\u044f \u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\/\u0413\u043e\u043c\u043e\u0442\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0422\u0435\u043e\u0440\u0438\u0438\u0422\u0438\u043f\u043e\u0432\/\u0418\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u00ab\u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u044f\u0437\u044b\u043a\u0435\u00bb \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u043d\u0438 \u0441\u044b\u043f\u044f\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 \u0438\u0437 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u044e\u0442 \u043a \u0441\u0432\u043e\u0438\u043c \u0436\u0435 <a href=\"http:\/\/www.amazon.com\/Categories-Working-Mathematician-Graduate-Mathematics\/dp\/0387984038\/\">\u0421\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u043c \u0422\u0435\u043a\u0441\u0442\u0430\u043c<\/a>.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b (\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439) \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Scala. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <b>type classes<\/b> \u0438 <b>generics of higher kind<\/b> (\u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0432\u0442\u043e\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Scalaz: <a href=\"https:\/\/github.com\/scalaz\/scalaz\/blob\/series\/7.2.x\/core\/src\/main\/scala\/scalaz\/Functor.scala\">scala.scalaz.Functor<\/a> + <a href=\"https:\/\/github.com\/scalaz\/scalaz\/blob\/series\/7.2.x\/core\/src\/main\/scala\/scalaz\/Contravariant.scala\">scala.scalaz.Contravariant<\/a>, Cats: <a href=\"https:\/\/github.com\/non\/cats\/blob\/master\/core\/src\/main\/scala\/cats\/Functor.scala\">scala.cats.Functor<\/a> + <a href=\"https:\/\/github.com\/non\/cats\/blob\/master\/core\/src\/main\/scala\/cats\/functor\/Contravariant.scala\">cats.functor.Contravariant<\/a>, Algebird: <a href=\"https:\/\/github.com\/twitter\/algebird\/blob\/develop\/algebird-core\/src\/main\/scala\/com\/twitter\/algebird\/Functor.scala\">com.twitter.algebird.Functor<\/a>). \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0430\u0441\u0442\u043e \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u0434\u0438\u043e\u043c\u0430\u043c covariant functor \u0438 contravariant functor, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u2014 Functor \u0438 Contravariant.<\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 Scala (\u0443\u0440\u043e\u0432\u043d\u044f L2-L3) \u2014 \u044d\u0442\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e Java \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 (\u044f \u0432\u0438\u0436\u0443 \u0442\u0440\u0438). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u00ab\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438\u00bb:  <\/p>\n<ol>\n<li>\u041d\u043e\u0432\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438\/\u0438\u0434\u0438\u043e\u043c\u0430\u043c\u0438\/\u043f\u0435\u0440\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u041d\u043e\u0432\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438 Scala \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0438\u0434\u0438\u043e\u043c.<\/li>\n<li>\u041d\u043e\u0432\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 Scala \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u0434\u0438\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432.<\/li>\n<li>\u041d\u043e\u0432\u044b\u043c\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0438\u0434\u0435\u0439 \u0438\u0434\u0438\u043e\u043c\u044b.<\/li>\n<\/ol>\n<p>  \u041d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e   <\/p>\n<ul>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0438\u043e\u043c \u2014 <b>\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/b> (\u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u044f\u0434\u0440\u043e FP\u00bb).<\/li>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u2014 <b>\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 production mode<\/b> \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0434\u0438\u043e\u043c, \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0445 \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.<\/li>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Scala \u2014 <b>\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 production mode<\/b> \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u0434\u0438\u043e\u043c.<\/li>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 <b>\u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c<\/b> \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0434\u0438\u043e\u043c.<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u00ab\u0442\u0440\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u00bb: \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0435, \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u0435, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 (\u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438)  <\/p>\n<table>\n<tr>\n<th>\u0418\u0434\u0438\u043e\u043c\u044b FP<\/th>\n<th>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b Scala<\/th>\n<th>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scala<\/th>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b\u044b \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438<\/th>\n<\/tr>\n<tr>\n<td>Covariant functor, applicative functor, monad, arrow<\/td>\n<td>Type classes, generics of higher kind<\/td>\n<td>Scalaz, Cats<\/td>\n<td>\u0422\u0435\u043e\u0440\u0438\u044f \u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/td>\n<\/tr>\n<tr>\n<td>Dependent pair, dependent function<\/td>\n<td>Path dependent types<\/td>\n<td>Shapeless<\/td>\n<td>\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/td>\n<\/tr>\n<tr>\n<td>\u041c\u043e\u043d\u043e\u0438\u0434, \u0433\u0440\u0443\u043f\u043f\u0430, \u043f\u043e\u043b\u0435, \u043a\u043e\u043b\u044c\u0446\u043e<\/td>\n<td>Type classes, generics of higher kind<\/td>\n<td>Algebird, Spire<\/td>\n<td>\u0410\u043b\u0433\u0435\u0431\u0440\u0430<\/td>\n<\/tr>\n<\/table>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e:  <\/p>\n<ul>\n<li><b>generics of higher king<\/b> \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430). \u0412 \u041e\u041e\u041f, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0442\u0438\u043f-\u043f\u0440\u0435\u0434\u043e\u043a.<\/li>\n<li><b>type classes<\/b> \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u00ab\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438\u00bb \u043a \u0412\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 (\u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u00ab\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f\u00bb \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c). \u0412 \u041e\u041e\u041f, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u043a\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c generics of higher king + type classes \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u044b \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e (\u0430 \u00ab\u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u043e\u0431\u0440\u044b\u0435 \u0442\u0440\u044e\u043a\u0438 \u041e\u041e\u041f\u00bb \u0442\u0443\u0442 \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442). \u041d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0443\u0442\u044c \u0438\u0434\u0438\u043e\u043c.<\/p>\n<p>  <a name=\"2\"><\/a>  <\/p>\n<h3>\u041f\u0440\u043e \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 Haskell<\/h3>\n<p>  \u0412 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 20-\u0433\u043e \u0432\u0435\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u2014 \u0442\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 (\u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0441\u0430\u043c\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0435\u0433\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_nonsense\">\u00ab\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0447\u0435\u043f\u0443\u0445\u0430\u00bb<\/a>). \u0422\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0438\u0437 \u043e\u0431\u0449\u0438\u0445 \u0438\u0434\u0435\u0439\/\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 (\u0442\u0435\u043e\u0440\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432, \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, &#8230;) \u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f\/\u0431\u0430\u0437\u044b \u0432\u0441\u0435\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 (\u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044f \u0442\u0435\u043e\u0440\u0438\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 20-\u0433\u043e \u0432\u0435\u043a\u0430). <\/p>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u043e\u0440\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0430\u043a\u0446\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u043c\u0438\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u0445 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438, \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 (\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430), &#8230;) \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e) \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043b\u0430\u043d\u0435, \u0442\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0430, \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e, <b>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f = \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e + \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/b>. \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0442\u043e\u0447\u043d\u0435\u0435, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 = \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u00ab\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u00bb \u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 = \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 = \u00ab\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00bb \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 <b>f: A =&gt; B<\/b> \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u00ab\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00bb (\u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)), \u0438 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0430\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u0435\u043d \u0434\u043b\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.<\/p>\n<p>  \u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u0430 \u0431\u043e\u0433\u0430\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 (\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043c\u043e\u043d\u0430\u0434\u044b, &#8230;) \u0438 \u044d\u0442\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u044f\u0437\u044b\u043a\u0438 \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 (\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Haskell). \u0420\u0430\u0441\u0441\u0432\u0435\u0442 Scala (2005-2010) \u0441\u043c\u0435\u0449\u0435\u043d \u043d\u0430 15 \u043b\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0432\u0435\u0442\u0430 Haskell (1990-1995) \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0438\u0437 Haskell \u0432 Scala. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f Scala-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 Haskell, \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u0430 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0442\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 =&gt; Haskell \u0431\u044b\u043b\u0438 \u0432\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0443\u0442\u0440\u0430\u0447\u0435\u043d\u044b \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439. \u0412\u0430\u0436\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432, \u043d\u043e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0432.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430:  <\/p>\n<ol>\n<li>\u0422\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439:\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Functor\">Covariant functor<\/a><\/li>\n<li><a href=\"http:\/\/cstheory.stackexchange.com\/questions\/12412\/explaining-applicative-functor-in-categorical-terms-monoidal-functors\">Applicative functor<\/a><\/li>\n<li>Arrow<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Monad_(category_theory)\">Monad<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Kleisli_category\">Kleisli<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Haskell:\n<ul>\n<li><a href=\"https:\/\/wiki.haskell.org\/Functor\">Covariant functor<\/a><\/li>\n<li><a href=\"https:\/\/wiki.haskell.org\/Applicative_functor\">Applicative functor<\/a><\/li>\n<li><a href=\"https:\/\/www.haskell.org\/arrows\/\">Arrow<\/a><\/li>\n<li><a href=\"https:\/\/wiki.haskell.org\/Monad\">Monad<\/a><\/li>\n<li><a href=\"https:\/\/hackage.haskell.org\/package\/data-category-0.6.1\/docs\/Data-Category-Kleisli.html\">Kleisli<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Scala (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Scalaz)\n<ul>\n<li><a href=\"https:\/\/github.com\/eed3si9n\/scalaz\/blob\/scalaz-seven\/core\/src\/main\/scala\/scalaz\/Functor.scala\">Covariant functor<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/eed3si9n\/scalaz\/blob\/scalaz-seven\/core\/src\/main\/scala\/scalaz\/Applicative.scala\">Applicative functor<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/eed3si9n\/scalaz\/blob\/scalaz-seven\/core\/src\/main\/scala\/scalaz\/Arrow.scala\">Arrow<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/eed3si9n\/scalaz\/blob\/scalaz-seven\/core\/src\/main\/scala\/scalaz\/Monad.scala\">Monad<\/a><\/li>\n<li><a href=\"http:\/\/docs.typelevel.org\/api\/scalaz\/nightly\/index.html#scalaz.Kleisli\">Kleisli<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <a name=\"3\"><\/a>  <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/h3>\n<p>  \u041e\u0434\u043d\u0438 \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e <b>Covariant Functor \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/b> (\u0435\u0441\u043b\u0438 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c, \u0442\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u00ab\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u00bb). \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0443, \u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043a \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0435, \u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e.<\/p>\n<p>  \u0414\u0440\u0443\u0433\u0438\u0435, \u0447\u0442\u043e <a href=\"https:\/\/wiki.haskell.org\/Typeclassopedia#Functor\"><b>Covariant Functor \u2014 \u044d\u0442\u043e \u00abcomputational context\u00bb<\/b><\/a>. \u042d\u0442\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e \u043e\u043d \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0436\u0435 \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043e\u0441\u0432\u043e\u0438\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438 \u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u00ab\u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u00bb. \u041f\u043e\u043a\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c.<\/p>\n<p>  \u0422\u0440\u0435\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u00ab\u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u00bb. <b>Covariant Functor \u2014 \u044d\u0442\u043e \u043d\u0435\u043a\u0438\u0439 \u0442\u0438\u043f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c<\/b>. \u041c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c (\u0434\u0432\u0443\u043c).<\/p>\n<p>  \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u00bb \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\/\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.<\/p>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u00ab\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u00bb, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0439 \u0442\u0438\u043f (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <b>X<\/b>) \u0438\u043c\u0435\u044e\u0449\u0438\u0439 type parameter (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <b>T<\/b>) \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <b>map<\/b>)  <\/p>\n<pre><code class=\"scala\">trait X[T] {   def map(f: T =&gt; R): X[R] } <\/code><\/pre>\n<p>  <b>\u0412\u0430\u0436\u043d\u043e:<\/b> \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0433\u043e trait-\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p>  \u00ab\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u00bb \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0432\u0435\u0441\u0442\u0438 \u0432 \u043e\u0431\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438  <\/p>\n<pre><code class=\"scala\">trait X[T] {   \/\/ covariant functor (functor)   def map[R](f: T =&gt; R): X[R]    \/\/ contravariant functor (contravariant)   def contramap[R](f: R =&gt; T): X[R]    \/\/ exponential functor (invariant functor)   def xmap[R](f: (T =&gt; R, R =&gt; T)): X[R]    \/\/ applicative functor   def apply[R](f: X[T =&gt; R]): X[R]    \/\/ monad   def flatMap[R](f: T =&gt; X[R]): X[R]    \/\/ comonad   def coflatMap[R](f: X[T] =&gt; R): X[R] } <\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u043e: \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0442\u0443\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c\u0438 (covariant \/ contravariant \/ exponential functors), \u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 (applicative functor, monad, comonad) \u2014 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>  <a name=\"4\"><\/a>  <\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/h3>\n<p>  \u0422\u0435, \u043a\u0442\u043e \u0443\u0436\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 Scala (\u0438\u043b\u0438 \u043d\u0430 Java 8), \u0442\u0443\u0442 \u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u00ab\u0442\u0438\u043f\u043e\u0432-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438:<\/p>\n<p>  <b>Option<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString  object Demo extends App {   val k: Option[Int] = Option(100500)   val s: Option[String] = k map toHexString } <\/code><\/pre>\n<p>  \u0438\u043b\u0438 \u0447\u0443\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u0436\u0438\u0437\u043d\u0438  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString  object Demo extends App  {   val k: Option[Int] = Map(&quot;A&quot; -&gt; 0, &quot;B&quot; -&gt; 1).get(&quot;C&quot;)   val s: Option[String] = s map toHexString  } <\/code><\/pre>\n<p>  <b>Try<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString import scala.util.Try  object Demo App {   val k: Try[Int] = Try(100500)   val s: Try[String] = k map toHexString } <\/code><\/pre>\n<p>  \u0438\u043b\u0438 \u0447\u0443\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u0436\u0438\u0437\u043d\u0438  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString import scala.util.Try  object Demo extends App {   def f(x: Int, y: Int): Try[Int] = Try(x \/ y)   val s: Try[String] = f(1, 0) map toHexString } <\/code><\/pre>\n<p>  <b>Future<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future  object Demo extends App {   val k: Future[Int] = Future(100500)   val s: Future[String] = k map toHexString } <\/code><\/pre>\n<p>  \u0438\u043b\u0438 \u0447\u0443\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u0436\u0438\u0437\u043d\u0438  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future  object Demo extends App {   def calc: Int = (0 to 1000000000).sum    val k: Future[Int] = Future(calc)   val s: Future[String] = k map toHexString } <\/code><\/pre>\n<p>  <b>List<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString  object Demo extends App {   val k: List[Int] = List(0, 42, 100500)   val s: List[String] = k map toHexString } <\/code><\/pre>\n<p>  <b>Parser<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.Integer.toHexString import scala.util.parsing.combinator._  object Demo extends RegexParsers with App {   val k: Parser[Int] = &quot;&quot;&quot;(0|[1-9]\\d*)&quot;&quot;&quot;.r ^^ { _.toInt }   val s: Parser[String] = k map toHexString    println(parseAll(k, &quot;255&quot;))   println(parseAll(s, &quot;255&quot;)) }  &gt;&gt; [1.4] parsed: 255 &gt;&gt; [1.4] parsed: FF <\/code><\/pre>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0430 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441\u0443\u0434\u044f \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e  <\/p>\n<ul>\n<li>Option \u2014 \u00ab\u043a\u0430\u043a \u0431\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00bb \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043b\u0435\u0436\u0438\u0442 (Some), \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u0442 (None).<\/li>\n<li>Try \u2014 \u00ab\u043a\u0430\u043a \u0431\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00bb \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043b\u0435\u0436\u0438\u0442 (Success), \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u0442 (Failure, \u0442\u043e\u0447\u043d\u0435\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0435\u0436\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435).<\/li>\n<li>Future \u2014 \u00ab\u043a\u0430\u043a \u0431\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00bb \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442, \u043c\u043e\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c, \u0438\u043b\u0438 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/li>\n<li>List \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c 0&#8230;N \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/li>\n<li>Parser \u2014 \u0442\u0443\u0442 \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u00ab\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f\u00bb, Parser \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, Parser \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432 \u044d\u0442\u043e\u043c \u043e\u043d \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/li>\n<\/ul>\n<p>  \u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439, \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u0440\u0430\u0432\u0438\u043b. \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0442\u0443\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u044e\u0442 \u043a \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u044d\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Functor\">\u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0433\u043e\u043c\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0435\u0435 \u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0430 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442-\u0441\u0442\u0440\u0435\u043b\u043a\u0430 (\u043f\u0440\u0430\u0432\u0438\u043b\u043e Identity Law) \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u0442\u0440\u0435\u043b\u043e\u043a (\u043f\u0440\u0430\u0432\u0438\u043b\u043e Composition law)). <\/p>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0435\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u0435\u043d \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0421\u0447\u0438\u0442\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u0446\u0435\u043b\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438).<\/p>\n<p>  <a name=\"5\"><\/a>  <\/p>\n<h3>\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/h3>\n<p>  \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 &#8216;fun&#8217; \u0434\u043e\u043b\u0436\u043d\u043e \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e IdentityLaw.case0(fun) \u2014 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0438 IdentityLaw.case1(fun).  <\/p>\n<pre><code class=\"scala\">object IdentityLaw {   def case0[T](fun: Functor[T]): Functor[T] = identity(fun)   def case1[T](fun: Functor[T]): Functor[T] = fun.map(identity) } <\/code><\/pre>\n<p>  \u0433\u0434\u0435 identity \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u0430\u044f \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f (\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f) \u0438\u0437 Predef.scala  <\/p>\n<pre><code class=\"scala\">object Predef ... {   def identity[A](x: A): A = x   ... } <\/code><\/pre>\n<p>  \u0421\u043e\u0432\u0441\u0435\u043c \u043a\u0440\u0430\u0442\u043a\u043e \u2014 fun.map(identity) \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u0417\u043d\u0430\u0447\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0435 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u2014 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u043c\u0443 \u0437\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430  <\/p>\n<pre><code class=\"scala\">\/\/ \u042d\u0442\u043e - \u041d\u0415 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 class Holder[T](value: T, ver: Int = 0) {   def map[R](f: T =&gt; R): Holder[R] = new Holder[R](f(value), ver + 1) } <\/code><\/pre>\n<p>  \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u00ab\u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u00bb \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u0434\u0430\u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 identity).<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 (\u0438 \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u0442\u043e\u0436\u0435).  <\/p>\n<pre><code class=\"scala\">\/\/ \u042d\u0442\u043e - \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 class Holder[T](value: T, ver: Int = 0) {   def map[R](f: T =&gt; R): Holder[R] = new Holder[R](f(value), ver) } <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <a name=\"6\"><\/a>  <\/p>\n<h3>\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/h3>\n<p>  \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 &#8216;fun[T]&#8217; \u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 &#8216;f: &#8216; \u0438 &#8216;g&#8217; \u0434\u043e\u043b\u0436\u043d\u043e \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e CompositionLaw.case0(fun) \u2014 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0438 CompositionLaw.case1(fun).  <\/p>\n<pre><code class=\"scala\">object Law\u0421ompose extends App {   def case0[T, R, Q](fun: Functor[T], f: T =&gt; R, g: R =&gt; Q): Functor[Q] =     (fun map f) map g   def case1[T, R, Q](fun: Functor[T], f: T =&gt; R, g: R =&gt; Q): Functor[Q] =     fun map (f andThen g) } <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 &#8216;f&#8217; \u0438 \u043f\u043e\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 &#8216;g&#8217; \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 f \u0438 g (f andThen g) \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0447\u0430\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u0438\u043f\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e.  <\/p>\n<pre><code class=\"scala\">sealed trait Tree[T] {   def map[R](f: T =&gt; R): Tree[R] } case class Node[T](value: T, fst: Tree[T], snd: Tree[T]) extends Tree[T] {   def map[R](f: T =&gt; R) = Node(f(value), fst map f, snd map f) } case class Leaf[T](value: T) extends Tree[T] {   def map[R](f: T =&gt; R) = Leaf(f(value)) } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 map(f: T=&gt;R) \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8216;f&#8217; \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0442\u0438\u043f\u0430 &#8216;T&#8217; \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043b\u0438\u0441\u0442\u0435 \u0438\u043b\u0438 \u0443\u0437\u043b\u0435 (Leaf, Node) \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u0443\u0437\u043b\u0430 (Node). \u0417\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0430\u0441   <\/p>\n<ul>\n<li>\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0435\u0440\u0435\u0432\u0430<\/li>\n<li>\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u00ab\u0432\u0438\u0441\u044f\u0449\u0438\u0445 \u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u0435\u00bb<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 (\u0438 Identity Law \u0438 Composition Law).<\/p>\n<p>  \u041d\u0415 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: \u043c\u0435\u043d\u044f\u044e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430  <\/p>\n<pre><code class=\"scala\">case class Node[T](value: T, fst: Tree[T], snd: Tree[T]) extends Tree[T] {   def map[R](f: T =&gt; R) = Node(f(value), snd map f, fst map f) } <\/code><\/pre>\n<p>  \u041d\u0415 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0434\u0440\u0430\u0441\u0442\u0430\u0435\u0442, \u043b\u0438\u0441\u0442\u044c\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0435\u0442\u043a\u0438  <\/p>\n<pre><code class=\"scala\">case class Leaf[T](value: T) extends Tree[T] {   def map[R](f: T =&gt; R) = Node(f(value), Leaf(f(value)), Leaf(f(value))) } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 (\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0439 map \u0432 \u0432\u0438\u0434\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0435\u0440\u0435\u0432\u0430. \u0417\u043d\u0430\u0447\u0438\u0442 \u0418 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 identity \u0438 \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0439 f \u0438 g \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f f andThen g.<\/p>\n<p>  <a name=\"7\"><\/a>  <\/p>\n<h3>\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u0443 \u043e\u0442 \u0430\u043a\u0441\u0438\u043e\u043c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438  <\/p>\n<pre><code class=\"scala\">case class LinFun(a: Int, b: Int) {   def apply(k: Int): Int = a * k + b   def andThen[A](that: LinFun): LinFun = LinFun(this.a * that.a, that.a * this.b + that.b) } <\/code><\/pre>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0441\u0430\u043c\u044b\u0445 \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0438\u0434\u0430 T=&gt;R \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u2014 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 Int, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u044f \u0443\u043c\u0435\u044e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0438\u043f\u0430 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b (Int)  <\/p>\n<pre><code class=\"scala\">sealed trait IntSeq {   def map(f: LinFun): IntSeq } case class Node(value: Int, tail: IntSeq) extends IntSeq {   override def map(f: LinFun): IntSeq = Node(f(value), tail.map(f)) } case object Last extends IntSeq {   override def map(f: LinFun): IntSeq = Last } <\/code><\/pre>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u2014 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f  <\/p>\n<pre><code class=\"scala\">object Demo extends App {   val seq = Node(0, Node(1, Node(2, Node(3, Last))))   val f = LinFun(2, 3) \/\/ k =&gt; 2 * k + 3   val g = LinFun(4, 5) \/\/ k =&gt; 4 * k + 5    val res0 = (seq map f) map g        \/\/ slow version   val res1 = seq map (f andThen g)     \/\/ fast version    println(res0)   println(res1) }  &gt;&gt; Node(17,Node(25,Node(33,Node(41,Last)))) &gt;&gt; Node(17,Node(25,Node(33,Node(41,Last)))) <\/code><\/pre>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0431\u043e   <\/p>\n<ol>\n<li>\u0414\u0412\u0410 \u0440\u0430\u0437\u0430 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 (\u0414\u0412\u0410 \u0440\u0430\u0437\u0430 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438)<\/li>\n<li>\u0438 \u0414\u0412\u0410 \u0440\u0430\u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (* \u0438 +)<\/li>\n<\/ol>\n<p>  \u043b\u0438\u0431\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e f andThen g \u0438  <\/p>\n<ol>\n<li>\u041e\u0414\u0418\u041d \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430<\/li>\n<li>\u0438 \u041e\u0414\u0418\u041d \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ol>\n<p>  <a name=\"10\"><\/a>  <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/h3>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 <b>X<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439 (\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <b>map<\/b>) \u0438 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c (<b>Identity Law<\/b>, <b>Composition Law<\/b>)  <\/p>\n<pre><code class=\"scala\">trait X[T] {   def map[R](f: T =&gt; R): X[R] } <\/code><\/pre>\n<p>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 <b>X<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 (\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <b>contramap<\/b>) \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439 \u0438 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c (\u043e\u043d\u0438 \u0442\u043e\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <b>Identity Law<\/b>, <b>Composition Law<\/b>)  <\/p>\n<pre><code class=\"scala\">trait X[T] {   def contramap[R](f: R =&gt; T): X[R] } <\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u041f\u043e\u0441\u0442\u043e\u0439\u0442\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 <b>T<\/b> \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <b>f: T =&gt; R<\/b>, \u0442\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 <b>R<\/b>. \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443, \u0442\u043e\u0442 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u044c \u0441\u0435\u0431\u044f \u0438 \u043d\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a, \u0438\u043c\u0435\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 <b>T<\/b> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <b>f: R =&gt; T<\/b>, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u0432 \u00ab\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\u00bb?!<\/p>\n<p>  \u0412 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0432 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043d\u0435 \u0443 \u0432\u0441\u044f\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0438 \u043d\u0435\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0430\u0439\u0442\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0436\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e (\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c,\u2026 \u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438) \u2014 \u043d\u0430\u0434\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>f: R =&gt; T<\/b> \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <b>g: T =&gt; R<\/b> \u0447\u0442\u043e \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430!<\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0430 (\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 ~ \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440) \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<p>  \u0412\u0441\u044f\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438  <\/p>\n<ul>\n<li>put \u2014 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/li>\n<li>get \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/li>\n<\/ul>\n<p>  \u043e\u0434\u043d\u0430\u043a\u043e \u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 (Option, Try, Future, List, Parser) \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 get, \u043d\u043e \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 put! \u0412 Option\/Try\/Future \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 (\u0438\u043b\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 apply \u043e\u0442 companion object) \u0438\u043b\u0438 \u0436\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412 Parser \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043f\u0430\u0441\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a Parser[T] \u2014 \u00ab\u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00bb \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 T. <b>Parser[T] \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a T, \u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435!<\/b><\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0441\u0435\u043a\u0440\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0435. <\/p>\n<p>  <b>\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0422\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/b><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u044d\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u0445\u0435\u043c\u044b<\/p>\n<pre>      +-------------------------+      | +------+ T              | R      | | X[T] -----&gt; f: T=&gt;R ----&gt;      | +------+                |      +-------------------------+ <\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u00ab\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437\u00bb \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 <b>T<\/b> \u043f\u043e\u0434\u0441\u0442\u0435\u0440\u0435\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>f: T=&gt;R<\/b> \u0438 \u0432\u043e\u0442 \u044d\u0442\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c <b>R<\/b>.<\/p>\n<p>  \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043d\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 Iterator \u0438 Stream \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<br \/>  ???<br \/>  ???<\/p>\n<p>  \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u00ab\u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u00bb \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <b>f: R =&gt; T<\/b> \u00ab\u043d\u0430 \u0432\u0445\u043e\u0434\u0435\u00bb, \u0430 \u043d\u0435 \u00ab\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435\u00bb.  <\/p>\n<pre>      +-------------------------+    R |              T +------+ |   -----&gt; f: R=&gt;T -----&gt; X[T] | |      |                +------+ |      +-------------------------+ <\/pre>\n<p>  <a name=\"11\"><\/a>  <\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Scala \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0438\u043f \u0441 \u043e\u0434\u043d\u0438\u043c type parameter, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c <a href=\"http:\/\/www.scala-lang.org\/api\/2.11.0-M2\/index.html#scala.math.Ordering\">Ordering<\/a> \u0438 <a href=\"http:\/\/www.scala-lang.org\/api\/2.11.0-M2\/index.html#scala.math.Equiv\">Equiv<\/a><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: <b>Ordering<\/b>  <\/p>\n<pre><code class=\"scala\">import scala.math.Ordering._  object Demo extends App {   val strX: Ordering[String] = String   val f: (Int =&gt; String) = _.toString   val intX: Ordering[Int] = strX on f } <\/code><\/pre>\n<p>  \u0418\u043c\u0435\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0438\u043c\u0435\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438  <\/p>\n<pre><code class=\"scala\">  val strX: Ordering[String] = String <\/code><\/pre>\n<p>  \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043d\u0435 java.lang.String, \u0430 scala.math.Ordering.String  <\/p>\n<pre><code class=\"scala\">package scala.math  trait Ordering[T] extends ...  {   trait StringOrdering extends Ordering[String] {     def compare(x: String, y: String) = x.compareTo(y)   }   implicit object String extends StringOrdering   ... } <\/code><\/pre>\n<p>  \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <b>contramap<\/b> \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <b>on<\/b>  <\/p>\n<pre><code class=\"scala\">package scala.math  trait Ordering[T] extends ... {   def on[R](f: R =&gt; T): Ordering[R] = new Ordering[R] {     def compare(x: R, y: R) = outer.compare(f(x), f(y))   }   ... } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: <b>Equiv<\/b>  <\/p>\n<pre><code class=\"scala\">import java.lang.String.CASE_INSENSITIVE_ORDER import scala.math.Equiv import scala.math.Equiv.{fromFunction, fromComparator}  object Demo extends App {   val strX: Equiv[String] = fromComparator(CASE_INSENSITIVE_ORDER)   val f: (Int =&gt; String) = _.toString   val intX: Equiv[Int] = fromFunction((x, y) =&gt; strX.equiv(f(x), f(y))) } <\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 scala.math.Equiz) \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430 java.lang.String.CASE_INSENSITIVE_ORDER  <\/p>\n<pre><code class=\"java\">package java.lang;  public final class String implements ... {     public static final Comparator&lt;String&gt; CASE_INSENSITIVE_ORDER                                          = new CaseInsensitiveComparator();      private static class CaseInsensitiveComparator             implements Comparator&lt;String&gt;, java.io.Serializable {         public int compare(String s1, String s2) {...}         ...     }     ... } <\/code><\/pre>\n<p>  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 fromComparator  <\/p>\n<pre><code class=\"scala\">object Equiv extends ... {   def fromComparator[T](cmp: Comparator[T]): Equiv[T] = new Equiv[T] {     def equiv(x: T, y: T) = cmp.compare(x, y) == 0   }   ... } <\/code><\/pre>\n<p>  \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u0430 contramap \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 fromFunction  <\/p>\n<pre><code class=\"scala\">object Equiv extends ... {   def fromFunction[T](cmp: (T, T) =&gt; Boolean): Equiv[T] = new Equiv[T] {     def equiv(x: T, y: T) = cmp(x, y)   }   ... } <\/code><\/pre>\n<p>  <a name=\"12\"><\/a>  <\/p>\n<h3>\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/h3>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 \u043a\u0440\u043e\u043c\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c. <\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e (Identity Law) \u0433\u043b\u0430\u0441\u0438\u0442: \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <b>fun<\/b> \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f IdentityLaw.case0(fun) \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u043e IdentityLaw.case1(fun)  <\/p>\n<pre><code class=\"scala\">object IdentityLaw {   def case0[T](fun: Contravariant[T]): Contravariant[T] = identity(fun)     def case1[T](fun: Contravariant[T]): Contravariant[T] = fun.contramap(identity) } <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<p>  <a name=\"13\"><\/a>  <\/p>\n<h3>\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/h3>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e (Composition Law) \u0433\u043b\u0430\u0441\u0438\u0442: \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <b>fun[T]<\/b> \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <b>f: Q =&gt; R<\/b> \u0438 <b>g: R =&gt; T<\/b> \u043f\u0430\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c IdentityLaw.case0(fun) \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u043e IdentityLaw.case1(fun)  <\/p>\n<pre><code class=\"scala\">object CompositionLaw {   def case0[Q, R, T](fun: Contravariant[T], f: Q =&gt; R, g: R =&gt; T): Contravariant[Q] =     (fun contramap g) contramap f   def case1[Q, R, T](fun: Contravariant[T], f: Q =&gt; R, g: R =&gt; T): Contravariant[Q] =     fun contramap (f andThen g) } <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439).<\/p>\n<p>  <a name=\"20\"><\/a>  <\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h3>\n<p>  \u041f\u043e\u043d\u044f\u0442\u0438\u044f \u043a\u043e- \u0438 \u043a\u043e\u043d\u0442\u0440\u0430-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 (\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 Scala \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Scalaz, Cats). <\/p>\n<p>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0448\u0430\u0433\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442:  <\/p>\n<ol>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043a\u043e- \u0438 \u043a\u043e\u043d\u0442\u0440\u0430- \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 (BiFunctor, ProFunctor, Exponential (Invariant) Functor)<\/li>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 (Applicative Functor, Arrow, Monad), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u0432\u043e\u0434\u043e\u043c-\u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a, \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c. \u0423\u043a\u0430\u0436\u0443 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u044f\u043a\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c.<\/li>\n<\/ol>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p>  P.S. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043c\u043e\u0439 \u043a\u0443\u0440\u0441 <a href=\"https:\/\/www.udemy.com\/scala-for-java-developers-ru\/?couponCode=HABR-COVARIANT-FUNCTOR\">\u00abScala for Java Developers\u00bb<\/a> \u0432\u0441\u0435\u0433\u043e \u0437\u0430 25% \u0446\u0435\u043d\u044b (\u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043a\u0443\u043f\u043e\u043d\u043e\u043c <b>HABR-COVARIANT-FUNCTOR<\/b>). \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043a\u0438\u0434\u043e\u0447\u043d\u044b\u0445 \u043a\u0443\u043f\u043e\u043d\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e!               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/266905\/\"> http:\/\/habrahabr.ru\/post\/266905\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0439 \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \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, \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0442\u0430\u043a \u0438 \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u00ab\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0443\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443\u00bb.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438 \u044d\u0437\u043e\u0442\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b Scala \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0434\u0432\u0430 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f  <\/p>\n<ul>\n<li><b>\u043a\u043e-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b><\/li>\n<li><b>\u043a\u043e\u043d\u0442\u0440\u0430-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b><\/li>\n<\/ul>\n<p> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c   <\/p>\n<ul>\n<li><b>Exponential (Invariant) Functor<\/b>, <b>BiFunctor<\/b>, <b>ProFunctor<\/b><\/li>\n<li><b>Applicative Functor<\/b>, <b>Arrow<\/b>, <b>Monad \/ Co-Monad<\/b><\/li>\n<li><b>Monad Transformers<\/b>, <b>Kleisli<\/b>, <b>Natural Transformations<\/b><\/li>\n<\/ul>\n<p>  \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0440\u043e\u043b\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 (<b><a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.Option\">Option<\/a>, <a href=\"http:\/\/www.scala-lang.org\/files\/archive\/nightly\/docs\/library\/index.html#scala.util.Try\">Try<\/a>, <a href=\"http:\/\/www.scala-lang.org\/files\/archive\/nightly\/docs\/library\/index.html#scala.concurrent.Future\">Future<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.collection.immutable.List\">List<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/2.10.2\/index.html#scala.util.parsing.combinator.Parsers$Parser\">Parser<\/a><\/b>) \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 (<b><a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.math.Ordering\">Ordering<\/a>, <a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.math.Equiv\">Equiv<\/a><\/b>) \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scala. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u0440 Scala, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \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 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 <b>\u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <a href=\"https:\/\/www.udemy.com\/scala-for-java-developers-ru\/?couponCode=HABR-COVARIANT-FUNCTOR\">\u00abScala for Java Developers\u00bb<\/a><\/b> (\u0432\u0438\u0434\u0435\u043e + \u0442\u0435\u0441\u0442\u044b).<\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#1\">\u041f\u0440\u043e \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#2\">\u041f\u0440\u043e \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 Haskell<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#3\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#4\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#5\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#6\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#7\">\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#10\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#11\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#12\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#13\">\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440: Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#20\">\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-265844","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/265844","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=265844"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/265844\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=265844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=265844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=265844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}