{"id":266020,"date":"2015-09-21T01:05:02","date_gmt":"2015-09-20T21:05:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=266020"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=266020","title":{"rendered":"FP \u043d\u0430 Scala: Invariant Functor"},"content":{"rendered":"<p>       \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f   <\/p>\n<ul>\n<li>\u041a\u0430\u043a \u0442\u0430\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043a\u0430\u043a <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b> (Invariant Functor), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u044d\u043a\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c (Exponential Functor), \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 Scala.<\/li>\n<li>\u0414\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 (<b>Identity Law<\/b>, <b>Composition Law<\/b>), \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u043b\u043e\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440.<\/li>\n<li>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c<\/b> (Value Holder)<\/li>\n<li>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430-\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f<\/b> \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 (\u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430)<\/li>\n<\/ul>\n<p>  \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/\">FP \u043d\u0430 Scala: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440?<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b  <\/p>\n<ul>\n<li>\u041a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 <b>\u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/b>, <b>Haskell<\/b> \u0438 <b>Scala<\/b>.<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <b>\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b>.<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <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>  \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 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <a href=\"https:\/\/www.udemy.com\/scala-for-java-developers-ru\/?couponCode=HABR-INVARIANT-FUNCTOR\">\u00abScala for Java Developers\u00bb<\/a> (\u0432\u0438\u0434\u0435\u043e + \u0442\u0435\u0441\u0442\u044b, \u0432\u0441\u0435\u0433\u043e \u0437\u0430 25% \u0446\u0435\u043d\u044b! \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u043a\u0443\u043f\u043e\u043d\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e!).<\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#0\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#10\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Invariant Functor<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#11\">Invariant Functor \u2014 Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#12\">Invariant Functor \u2014 Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#20\">\u041f\u0440\u0438\u043c\u0435\u0440 #1: Value Holder<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#21\">\u041f\u0440\u0438\u043c\u0435\u0440 #2: \u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#30\">\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#100\">\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/a><\/li>\n<\/ul>\n<p>  <a name=\"habracut\"><\/a><br \/>  <a name=\"0\"><\/a>  <\/p>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>:  <\/p>\n<ul>\n<li>\u041d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0442\u044c \u0442\u0435\u043e\u0440\u0438\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u0447\u0442\u043e \u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \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. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0435\u043e\u0440\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/li>\n<li>\u0420\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 \u0432 Scala \u043f\u0440\u0438\u0448\u043b\u0438 \u0438\u0437 Haskell. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0437\u0440\u0435\u043b\u043e\u0433\u043e Haskell, \u0447\u0442\u043e \u0431\u044b \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u043b\u043e\u0434\u043e\u0439 Scala.<\/li>\n<li>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (<a href=\"https:\/\/github.com\/scalaz\/scalaz\">Scalaz<\/a>, <a href=\"https:\/\/github.com\/non\/cats\">Cats<\/a>) \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \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\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <b>generics of higher kind<\/b>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c (\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0438 \u0432 Java \u043d\u0438 \u0432 C#) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \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\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \u00ab\u0428\u0442\u0443\u0447\u043d\u044b\u0435\u00bb \u0438\u0434\u0438\u043e\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438.<\/li>\n<li>\u041a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<li>\u041a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<\/ul>\n<p>.<br \/>  \u041d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0430\u0432\u0442\u043e\u0440 <b>\u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442<\/b> \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/a>.<\/p>\n<p>  <a name=\"10\"><\/a>  <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Invariant Functor<\/h3>\n<p>  \u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \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 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u00ab\u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u043b\u0430\u043a\u043e\u043d\u0435\u00bb.<\/p>\n<p>  \u0412 \u0432\u0438\u0434\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c  <\/p>\n<pre><code class=\"scala\">trait Invariant[T] {   def xmap[R](f: T =&gt; R, g: R =&gt; T): Invariant[R] } <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u0438 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0443 (<b>f: T =&gt; R<\/b>) \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u043c\u0443 (<b>g: R =&gt; T<\/b>). <\/p>\n<p>  \u0418\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438  <\/p>\n<pre>      +---------------------------------------+    R |             T  +------+  T            | R    -----&gt; f: R=&gt;T -----&gt; C[T] -----&gt; g: T=&gt;R -----&gt;      |                +------+               |      +---------------------------------------+ <\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u00ab\u043e\u0442\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u00bb <b>Invariant[R]<\/b> \u00ab\u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f\u00bb \u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 <b>Invariant[T]<\/b> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u044b \u0432\u0437\u0430\u0438\u043c\u043d\u043e-\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 <b>f<\/b> \u0438 <b>g<\/b> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u00ab\u043f\u043e\u0434\u0436\u0438\u0434\u0430\u044e\u0442\u00bb \u0434\u0430\u043d\u043d\u044b\u0435 \u00ab\u043d\u0430 \u0432\u0445\u043e\u0434\u0435\u00bb \u0438 \u00ab\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435\u00bb.<\/p>\n<p>  <a name=\"11\"><\/a>  <\/p>\n<h3>Invariant Functor \u2014 Identity Law<\/h3>\n<p>  Invariant Functor (\u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441 Covariant Functor \u0438 Contravariant Functor) \u0442\u043e\u0436\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b. \u0418 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0435 (Identity Law) \u0433\u043b\u0430\u0441\u0438\u0442: \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <b>fun[T]<\/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: Invariant[T]): Invariant[T] = fun   def case1[T](fun: Invariant[T]): Invariant[T] = fun.xmap(x =&gt; x, x =&gt; x) } <\/code><\/pre>\n<p>  \u0421\u043c\u044b\u0441\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043a \u0441\u043c\u044b\u0441\u043b\u0443 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#5\">Identity Law \u0434\u043b\u044f Covariant Functor<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#12\">Identity Law \u0434\u043b\u044f Contravariant Functor<\/a>.<\/p>\n<p>  <a name=\"12\"><\/a>  <\/p>\n<h3>Invariant Functor \u2014 Composition Law<\/h3>\n<p>  \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u0442\u043e\u0440\u043e\u0435 (Composition Law) \u0433\u043b\u0430\u0441\u0438\u0442: \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 <b>fun[T]<\/b> \u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <b>f1: T =&gt; R<\/b>, <b>g1: R =&gt; T<\/b>, <b>f2: R =&gt; Q<\/b>, <b>g2: Q =&gt; R<\/b> \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f CompositionLaw.case0(fun, f1, g1, f2, g2) \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u043e CompositionLaw.case1(fun, f1, g1, f2, g2).  <\/p>\n<pre><code class=\"scala\">object CompositionLaw {   def case0[T, R, Q](fun: Invariant[T], f1: T =&gt; R, g1: R =&gt; T, f2: R =&gt; Q, g2: Q =&gt; R): Invariant[Q] =     fun.xmap(f1, g1).xmap(f2, g2)   def case1[T, R, Q](fun: Invariant[T], f1: T =&gt; R, g1: R =&gt; T, f2: R =&gt; Q, g2: Q =&gt; R): Invariant[Q] =     fun.xmap(f2 compose f1, g1 compose g2) } <\/code><\/pre>\n<p>  \u0421\u043c\u044b\u0441\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043a \u0441\u043c\u044b\u0441\u043b\u0443 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#6\">Composition Law \u0434\u043b\u044f Covariant Functor<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#13\">Composition Law \u0434\u043b\u044f Contravariant Functor<\/a>.<\/p>\n<p>  <a name=\"20\"><\/a>  <\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 #1: Value Holder<\/h3>\n<p>  \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \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 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u2014 \u044d\u0442\u043e \u0434\u0432\u0435 \u043a\u0430\u043a \u0431\u044b \u00ab\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u00bb (\u044d\u0442\u043e \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0430, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 + \u043f\u0440\u0430\u0432\u0438\u043b\u0430). \u0417\u043d\u0430\u0447\u0438\u0442, \u0435\u0441\u043b\u0438 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 (\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439) \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e <b>\u0438<\/b> \u0442\u043e <b>\u0438<\/b> \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u043e \u0432 \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 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 value holder.  <\/p>\n<pre><code class=\"scala\">trait Holder[T] { self =&gt;   def put(arg: T): Unit   def get: T   def xmap[R](f: T =&gt; R, g: R =&gt; T): Holder[R] = new Holder[R] {     override def put(arg: R): Unit = self.put(g(arg))     override def get: R = f(self.get)   } } <\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 value holder \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a.  <\/p>\n<pre><code class=\"scala\">class StrHolder(var value: String = null) extends Holder[String] {   override def put(arg: String): Unit = {value = arg}   override def get: String = value } <\/code><\/pre>\n<p>  \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f  <\/p>\n<pre><code class=\"scala\">object Demo extends App {   val f: String =&gt; Int = Integer.parseInt(_, 16)   val g: Int =&gt; String = Integer.toHexString    val s: Holder[String] = new StrHolder   val k: Holder[Int] = s xmap (f, g)    k put 100500   println(k get) }  &gt;&gt; 100500 <\/code><\/pre>\n<p>  \u0423 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Int, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0445 \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<p>  \u041d\u0443 \u0430 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 value holder? \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0440\u0430\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445  <\/p>\n<ul>\n<li>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0432\u0435\u0440\u0441\u0438\u044e, \u043b\u043e\u0433 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 put\/get, &#8230;).<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f (\u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 put\/get, \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c, &#8230;).<\/li>\n<\/ul>\n<p>  <b>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044e\u00bb \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 xmap, \u043d\u043e \u043d\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 (put, get)! \u041c\u043e\u0436\u043d\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u044b put\/get\/&#8230;, \u043d\u043e \u043d\u0435 xmap.<br \/>  <b>\u0417\u0430\u0434\u0430\u043d\u0438\u0435:<\/b> \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0439\u0442\u0435 \u0442\u0430\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<p>  <a name=\"21\"><\/a>  <\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 #2: \u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430<\/h3>\n<p>  \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \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\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c (Identity Law, Composition Law), \u0430 \u043d\u0435 \u00ab\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u00bb. \u041c\u044b \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b <b>\u0445\u0440\u0430\u043d\u0438\u0442\u044c<\/b> \u0434\u0430\u043d\u043d\u044b\u0435 (\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f), \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 put \u0438 get \u0434\u043e\u043b\u0436\u043d\u044b \u00ab\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u00bb, \u0442.\u0435. \u043c\u044b \u0438\u0449\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 type parameter T \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0438 \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438. <\/p>\n<p>  \u041d\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c <b>\u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/b>! \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c (\u043c\u0435\u0442\u043e\u0434), \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438).<\/p>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044e (\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u044e\u0442 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440. \u0421\u043e\u0432\u0441\u0435\u043c \u0443\u0436 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u043d\u043e \u043e\u043d\u0438, <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/#11\">\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\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>\u0413\u0440\u0443\u043f\u043f\u043e\u0438\u0434 (groupoid)<\/b> \u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043d\u0430\u0431\u0436\u0435\u043d\u043d\u043e\u0435 \u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (T # T =&gt; T, T \u2014 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0433\u0440\u0443\u043f\u043f\u043e\u0438\u0434\u0430, # \u2014 \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430.<\/p>\n<p>  <b>\u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 (semigroup)<\/b> \u2014 \u044d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u043e\u0438\u0434, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430 ((a # b) # c == a # (b # c) \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u0438\u0445 a, b \u0438 c).<\/p>\n<p>  <b>\u041c\u043e\u043d\u043e\u0438\u0434 (monoid)<\/b> \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 \u0441 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c (\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#8216;e&#8217;, \u0447\u0442\u043e a # e == e # a == a, \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e a).<\/p>\n<table>\n<tr>\n<th>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439<\/th>\n<th>\u0413\u0440\u0443\u043f\u043f\u043e\u0438\u0434<\/th>\n<th>\u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430<\/th>\n<th>\u041c\u043e\u043d\u043e\u0438\u0434<\/th>\n<\/tr>\n<tr>\n<td>Int \u0438 &#8216;+&#8217;<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<\/tr>\n<tr>\n<td>Int \u0438 &#8216;-&#8216;<\/td>\n<td>+<\/td>\n<td>&#8212;<\/td>\n<td>&#8212;<\/td>\n<\/tr>\n<tr>\n<td>Int \u0438 &#8216;*&#8217;<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<\/tr>\n<tr>\n<td>Int \u0438 &#8216;\/&#8217;<\/td>\n<td>&#8212;<\/td>\n<td>&#8212;<\/td>\n<td>&#8212;<\/td>\n<\/tr>\n<tr>\n<td>String \u0438 &#8216;+&#8217;<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<\/tr>\n<tr>\n<td>String (\u0431\u0435\u0437 &quot;&quot;) \u0438 &#8216;+&#8217;<\/td>\n<td>+<\/td>\n<td>+<\/td>\n<td>&#8212;<\/td>\n<\/tr>\n<\/table>\n<p>  \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f  <\/p>\n<ol>\n<li>\u0412 Int \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 0 \u043d\u0435\u043b\u044c\u0437\u044f, ArithmeticException \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 Int.<\/li>\n<li>\u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u2014 \u043d\u0435\u0442.<\/li>\n<li>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b Int \u043f\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#8216;0&#8217;.<\/li>\n<li>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b Int \u043f\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#8216;1&#8217;.<\/li>\n<li>\u0412 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043f\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (&quot;&quot;).<\/li>\n<\/ol>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 (\u0438\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u043e\u0438\u0434, \u0432 Scala \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u0442\u0430\u043f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438) \u0432 \u0432\u0438\u0434\u0435 trait, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430  <\/p>\n<pre><code class=\"scala\">trait Semi[T] {   def |+|(x: T, y: T): T } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c (\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c) \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c  <\/p>\n<pre><code class=\"scala\">trait Semi[T] { self =&gt;   def |+|(x: T, y: T): T   def xmap[R](f: T =&gt; R, g: R =&gt; T): Semi[R] = new Semi[R] {     override def |+|(x: R, y: R): R = f(self |+| (g(x), g(y)))   } } <\/code><\/pre>\n<p>  \u0412\u044b\u0440\u0430\u0437\u0438\u043c \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u0441\u0442\u0440\u043e\u043a \u043f\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438  <\/p>\n<pre><code class=\"scala\">class SemiStr extends Semi[String]{   override def |+|(x: String, y: String): String = x + y } <\/code><\/pre>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0442\u0440\u043e\u043a \u043f\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u043a <b>\u00ab\u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0435 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043f\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438\u00bb<\/b>  <\/p>\n<pre><code class=\"scala\">object SemiDemo10 extends App {   val f: String =&gt; Int = _.toInt   val g: Int =&gt; String = _.toString    val x: Semi[String] = new SemiStr   val y: Semi[Int] = x xmap (f, g)    println(y.|+|(100, 500)) }  &gt;&gt; 100500 <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445 (Semi[Int]) \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (100 |+| 500 =&gt; \u00ab100\u00bb |+| \u00ab500\u00bb =&gt; \u00ab100500\u00bb =&gt; 100500).<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u0430\u043d\u0430\u043b\u0435\u043d, \u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435  <\/p>\n<pre><code class=\"scala\">object SemiDemo16 extends App {   val f: String =&gt; Int = Integer.parseInt(_, 16)   val g: Int =&gt; String = Integer.toHexString    val x: Semi[String] = new SemiStr   val y: Semi[Int] = x xmap (f, g)    println(y.|+|(10, 10)) }  &gt;&gt; 170 <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445 (Semi[Int]) \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0447\u0438\u0441\u043b\u0430 <b>\u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439<\/b> \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (10 |+| 10 =&gt; \u00abA\u00bb |+| \u00abA\u00bb =&gt; \u00abAA\u00bb =&gt; 10 * 16 + 10 = 170). \u041c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0434 Int \u0432\u0441\u0435 \u0435\u0449\u0435 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430 (\u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Int \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435).<\/p>\n<p>  <a href=\"https:\/\/github.com\/scalaz\/scalaz\/blob\/series\/7.1.x\/core\/src\/main\/scala\/scalaz\/InvariantFunctor.scala\">\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Scalaz \u0442\u043e\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430 \u0438 \u043c\u043e\u043d\u043e\u0438\u0434 \u2014 \u044d\u0442\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/a>.  <\/p>\n<pre><code class=\"scala\">package scalaz  object InvariantFunctor {   \/** Semigroup is an invariant functor. *\/   implicit val semigroupInvariantFunctor: InvariantFunctor[Semigroup]      = new InvariantFunctor[Semigroup] {...}   \/** Monoid is an invariant functor. *\/   implicit val monoidInvariantFunctor: InvariantFunctor[Monoid]      = new InvariantFunctor[Monoid] {...}   ... } <\/code><\/pre>\n<p>  <a name=\"30\"><\/a>  <\/p>\n<h3>\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445<\/h3>\n<p>  \u041b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0447\u0438\u0442\u044c Scala \u0438 FP \u2014 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 Scala \u0438 FP. <\/p>\n<p>  <b>Scalaz<\/b> \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0438 \u0437\u0440\u0435\u043b\u0430\u044f \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0412\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0434\u0438\u0437\u0430\u0439\u043d \u0432\u0437\u044f\u0442 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Haskell = <a href=\"https:\/\/github.com\/scalaz\/scalaz\/blob\/series\/7.1.x\/core\/src\/main\/scala\/scalaz\/InvariantFunctor.scala\">scalaz.InvariantFunctor<\/a><\/p>\n<p>  <b>Cats<\/b> \u2014 \u044d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043d\u043e\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 (\u0447\u0435\u043c \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0430 Scalaz \u2014 \u043d\u0435 \u0437\u043d\u0430\u044e) = <a href=\"https:\/\/github.com\/non\/cats\/blob\/master\/core\/src\/main\/scala\/cats\/functor\/Invariant.scala\">cats.functor.Invariant<\/a><\/p>\n<p>  <b>Play JSON library<\/b> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/playframework\/playframework\/blob\/master\/framework\/src\/play-functional\/src\/main\/scala\/play\/api\/libs\/functional\/Functors.scala?source=c#L16\">invariant functor<\/a>, \u044d\u0442\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u044e\u0442 <a href=\"http:\/\/stackoverflow.com\/questions\/21714825\/create-writes-and-format-of-case-class\/\">\u0442\u0443\u0442<\/a> \u0438 <a href=\"http:\/\/stackoverflow.com\/questions\/21990112\/play-json-invariantfunctor\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  <a name=\"100\"><\/a>  <\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h3>\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\/267087\/\"> http:\/\/habrahabr.ru\/post\/267087\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f   <\/p>\n<ul>\n<li>\u041a\u0430\u043a \u0442\u0430\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043a\u0430\u043a <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b> (Invariant Functor), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u044d\u043a\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c (Exponential Functor), \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 Scala.<\/li>\n<li>\u0414\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 (<b>Identity Law<\/b>, <b>Composition Law<\/b>), \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u043b\u043e\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440.<\/li>\n<li>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c<\/b> (Value Holder)<\/li>\n<li>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 <b>\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430-\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f<\/b> \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 (\u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430)<\/li>\n<\/ul>\n<p>  \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/266905\/\">FP \u043d\u0430 Scala: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440?<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b  <\/p>\n<ul>\n<li>\u041a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 <b>\u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439<\/b>, <b>Haskell<\/b> \u0438 <b>Scala<\/b>.<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <b>\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/b>.<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <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>  \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 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <a href=\"https:\/\/www.udemy.com\/scala-for-java-developers-ru\/?couponCode=HABR-INVARIANT-FUNCTOR\">\u00abScala for Java Developers\u00bb<\/a> (\u0432\u0438\u0434\u0435\u043e + \u0442\u0435\u0441\u0442\u044b, \u0432\u0441\u0435\u0433\u043e \u0437\u0430 25% \u0446\u0435\u043d\u044b! \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u043a\u0443\u043f\u043e\u043d\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e!).<\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#0\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#10\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Invariant Functor<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#11\">Invariant Functor \u2014 Identity Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#12\">Invariant Functor \u2014 Composition Law<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#20\">\u041f\u0440\u0438\u043c\u0435\u0440 #1: Value Holder<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#21\">\u041f\u0440\u0438\u043c\u0435\u0440 #2: \u041f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0430<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#30\">\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/267087\/#100\">\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-266020","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/266020","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=266020"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/266020\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=266020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=266020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=266020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}