{"id":285683,"date":"2017-04-28T15:26:17","date_gmt":"2017-04-28T11:26:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=285683"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=285683","title":{"rendered":"\u0424\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 \u0432 JavaScript \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/89a\/77b\/f22\/89a77bf2292f4c58addca4905d5a6d0f.jpg\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0424\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 (\u0424\u041f) \u043c\u043e\u0436\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0430\u0448 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u041d\u043e \u0424\u041f \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0435 \u0443\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u044b (Monads), \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (Applicative) \u0438 \u0442. \u0434., \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u043c \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0449\u043d\u044b\u0445 \u0424\u041f-\u043c\u0435\u0442\u043e\u0434\u0438\u043a. \u042f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0443\u043f\u0443\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c: \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0434\u0435\u043b\u0430\u043d \u0443\u043f\u043e\u0440 \u043d\u0430 \u0442\u043e\u043c, <strong>\u0417\u0410\u0427\u0415\u041c<\/strong> \u043d\u0443\u0436\u043d\u0430 \u0444\u0438\u0447\u0430 \u0425, \u0430 \u043d\u0435 \u043d\u0430 \u0442\u043e\u043c, <strong>\u0427\u0422\u041e<\/strong> \u0442\u0430\u043a\u043e\u0435 \u0444\u0438\u0447\u0430 \u0425.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"funkcionalnoe-programmirovanie\">\u0424\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<\/h2>\n<p>  <\/p>\n<p>\u0424\u041f \u2014 \u044d\u0442\u043e \u0441\u0442\u0438\u043b\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0424\u041f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0434\u0440\u044f\u0434. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0434\u043d\u0443 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0440\u043e\u0434\u0435 <strong>(func1.func2.func3)<\/strong> \u0438\u043b\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 <strong>func1(func2(func3()))<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<h4 id=\"problemy-fp\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0424\u041f<\/h4>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0443\u0442\u0451\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e\u2026<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 if-else? <strong>(\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u043c\u043e\u043d\u0430\u0434\u0430 Either)<\/strong><\/li>\n<li>\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Null? <strong>(\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u043c\u043e\u043d\u0430\u0434\u0430 Maybe)<\/strong><\/li>\n<li>\u041a\u0430\u043a \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0437\u0434\u0435? <strong>(\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (Pure functions), \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (referential transparency))<\/strong><\/li>\n<li>\u041a\u0430\u043a \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430\u043c\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445? <strong>(\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (Pure functions), \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c)<\/strong><\/li>\n<li>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0435\u0440\u0451\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u0440\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 (chaining) \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u043a\u0430\u043a \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0447\u0430\u0441\u0442\u044c\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0438? <strong>(\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (currying) \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430)<\/strong><\/li>\n<li>\u0418 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 &lt;\u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u044e\u0434\u0430 \u0432\u0430\u0448 \u0432\u043e\u043f\u0440\u043e\u0441&gt;.<\/li>\n<\/ol>\n<p>  <\/p>\n<h4 id=\"fp-reshenie\">\u0424\u041f-\u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 Haskell \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u043d\u0430\u0434\u044b, \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0438 \u0442. \u0434. JavaScript \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u0438\u043b\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443 \u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0424\u041f-\u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"specifikacii-fantasy-land-i-fp-biblioteki\">\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Fantasy Land \u0438 \u0424\u041f-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0445\u043e\u0442\u044f\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u043f\u0440., \u0442\u043e \u0438\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043a\u043b\u0430\u0441\u0441\u044b, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 Haskell.<\/p>\n<p>  <\/p>\n<p>\u042f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <a href=\"https:\/\/github.com\/fantasyland\/fantasy-land\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Fantasy Land<\/a>, \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0449\u0438\u0435, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u0430\u044f JS-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\/\u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/84a\/91e\/ab1\/84a91eab1eaa4bc0adf68067409ac24e.png\" alt=\"image\"\/> <\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b \u0432\u0441\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u2014 \u043f\u043e \u0441\u0443\u0442\u0438 \u0437\u0430\u043a\u043e\u043d\u044b, \u043e\u043d\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c \u0432 Java. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f JS \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b (\u0432\u0440\u043e\u0434\u0435 <strong>map, of, chain<\/strong> \u0438 \u0442. \u0434.).<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<p>JS-\u043a\u043b\u0430\u0441\u0441 \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 (Functor), \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 map. \u0418 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 (\u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435, \u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435).<\/p>\n<p>  <\/p>\n<p>JS-\u043a\u043b\u0430\u0441\u0441 \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440 Apply (Apply Functor), \u0435\u0441\u043b\u0438 \u043e\u043d \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 map \u0438 ap.<\/p>\n<p>  <\/p>\n<p>JS-\u043a\u043b\u0430\u0441\u0441 \u2014 \u044d\u0442\u043e \u043c\u043e\u043d\u0430\u0434\u0430 (Monad Functor), \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f Functor, Apply, Applicative, Chain \u0438 \u0441\u0430\u043c\u043e\u0439 Monad (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439).<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u043d\u0430\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u2014 Applicative \u0438 Chain (\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c).<\/p>\n<p>  <\/p>\n<h4 id=\"biblioteki-sovmestimye-so-specifikaciyami-fantasy-land\">\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438 Fantasy Land<\/h4>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 FL. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <strong><a href=\"https:\/\/cwmyers.github.io\/monet.js\/\">monet.js<\/a>, <a href=\"https:\/\/github.com\/cullophid\/barely-functional\">barely-functional<\/a>, <a href=\"http:\/\/folktalejs.org\/\">folktalejs<\/a>, <a href=\"https:\/\/github.com\/ramda\/ramda-fantasy\">ramda-fantasy<\/a> (\u043d\u0430 \u0431\u0430\u0437\u0435 Ramda), <a href=\"https:\/\/github.com\/DrBoolean\/immutable-ext\">immutable-ext<\/a> (\u043d\u0430 \u0431\u0430\u0437\u0435 ImmutableJS), <a href=\"https:\/\/github.com\/Avaq\/Fluture\">Fluture<\/a> \u0438 \u0434\u0440.<\/strong><\/p>\n<p>  <\/p>\n<h2 id=\"kakie-biblioteki-mne-luchshe-ispolzovat\">\u041a\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043d\u0435 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?<\/h2>\n<p>  <\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/github.com\/lodash\/lodash\/wiki\/FP-Guide\">lodash-fp<\/a> \u0438 <a href=\"http:\/\/ramdajs.com\/\">ramdajs<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u0442\u0438\u043b\u0435 \u0424\u041f. \u041d\u043e \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 \u043c\u043e\u043d\u0430\u0434, \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 \u0440\u0435\u0434\u044c\u044e\u0441\u0435\u0440\u0430 (Foldable), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u0440\u0435\u0448\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044f \u0431\u044b \u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 FL: <strong><a href=\"https:\/\/cwmyers.github.io\/monet.js\/\">monet.js<\/a>, <a href=\"https:\/\/github.com\/cullophid\/barely-functional\">barely-functional<\/a>, <a href=\"http:\/\/folktalejs.org\/\">folktalejs<\/a>, <a href=\"https:\/\/github.com\/ramda\/ramda-fantasy\">ramda-fantasy<\/a> (\u043d\u0430 \u0431\u0430\u0437\u0435 Ramda), <a href=\"https:\/\/github.com\/DrBoolean\/immutable-ext\">immutable-ext<\/a> (\u043d\u0430 \u0431\u0430\u0437\u0435 ImmutableJS), <a href=\"https:\/\/github.com\/Avaq\/Fluture\">Fluture<\/a> \u0438 \u0442. \u0434.<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c <a href=\"http:\/\/ramdajs.com\/\">ramdajs<\/a> \u0438 <a href=\"https:\/\/github.com\/ramda\/ramda-fantasy\">ramda-fantasy<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0441\u043d\u043e\u0432\u0430\u0445, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u0438 \u0438\u0437\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438 \u0424\u041f.<\/p>\n<p>  <\/p>\n<h2 id=\"primer-1-rabota-s-proverkami-na-null\">\u041f\u0440\u0438\u043c\u0435\u0440 1. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u043d\u0430 Null<\/h2>\n<p>  <\/p>\n<p><strong><em>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f: \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043c\u043e\u043d\u0430\u0434\u044b, \u043c\u043e\u043d\u0430\u0434\u044b Maybe, \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/em><\/strong><\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435:<\/strong> \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <strong>\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430<\/strong>. \u041d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <strong>getUrlForUser<\/strong>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 URL \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 URL\u2019\u043e\u0432 <strong>(indexURL\u2019\u044b)<\/strong> \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e <strong>(joeUser)<\/strong> \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (\u0438\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/2bd\/e46\/e95\/2bde46e95ed948dd86c42db32e9e7c55.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u044f\u0437\u044b\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null. \u0418 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null (\u043d\u0435 \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0435\u043d). \u042f\u0437\u044b\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 indexURL\u2019\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 nulls \u0438\u043b\u0438 undefined.<\/p>\n<p>  <\/p>\n<pre><code>\/\/TODO \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u044d\u0442\u043e \u0432 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u044f\u0445 const getUrlForUser = (user) =&gt; { \/\/todo } \/\/\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 let joeUser = {     name: 'joe',     email: 'joe@example.com',     prefs: {         languages: {             primary: 'sp',             secondary: 'en'         }     } }; \/\/\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 indexURL\u2019\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 let indexURLs = {     'en': 'http:\/\/mysite.com\/en',  \/\/\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439      'sp': 'http:\/\/mysite.com\/sp', \/\/\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439     'jp': 'http:\/\/mysite.com\/jp'   \/\/\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439 } \/\/apply url to window.location const showIndexPage = (url) =&gt; { window.location = url };<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"reshenie-imperativnoe-protiv-funkcionalnogo\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 (\u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e):<\/h3>\n<p>  <\/p>\n<p>\u041d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0439\u0442\u0435, \u0435\u0441\u043b\u0438 \u0424\u041f-\u0432\u0435\u0440\u0441\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0440\u0443\u0434\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0414\u0430\u043b\u044c\u0448\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0435\u0451 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f: \/\/\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e if-else \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 null; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 indexURL\u2019\u043e\u0432; \u00ab\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435\u00bb URL\u2019\u044b \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  const getUrlForUser = (user) =&gt; {   if (user == null) { \/\/\u043d\u0435 \u0437\u0430\u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d     return indexURLs['en']; \/\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e   }   if (user.prefs.languages.primary &amp;&amp; user.prefs.languages.primary != 'undefined') {     if (indexURLs[user.prefs.languages.primary]) {\/\/\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 indexURLs[user.prefs.languages.primary];     } else {       return indexURLs['en'];     }   } }  \/\/\u0432\u044b\u0437\u043e\u0432 showIndexPage(getUrlForUser(joeUser));  \/\/\u0424\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: \/\/(\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435, \u0431\u0430\u0433\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435) \/\/\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0424\u041f-\u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438: \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u043c\u043e\u043d\u0430\u0434\u0430 Maybe \u0438 Currying const R = require('ramda'); const prop = R.prop; const path = R.path; const curry = R.curry; const Maybe = require('ramda-fantasy').Maybe;  const getURLForUser = (user) =&gt; {     return Maybe(user)\/\/\u043e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 Maybe         .map(path(['prefs', 'languages', 'primary'])) \/\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Ramda \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430         .chain(maybeGetUrl); \/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u044f\u0437\u044b\u043a \u0432 maybeGetUrl \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c URL \u0438\u043b\u0438 \u043c\u043e\u043d\u0430\u0434\u0443 null }  const maybeGetUrl = R.curry(function(allUrls, language) {\/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043e\u0434\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c     return Maybe(allUrls[language]);\/\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043c\u043e\u043d\u0430\u0434\u0443 (url | null) })(indexURLs);\/\/ \u0432\u043c\u0435\u0441\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c indexURLs   function boot(user, defaultURL) {    showIndexPage(getURLForUser(user).getOrElse(defaultURL)); }  boot(joeUser, 'http:\/\/site.com\/en'); \/\/'http:\/\/site.com\/sp'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0424\u041f-\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"funktory\">\u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b<\/h3>\n<p>  <\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 (\u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440) \u0438\u043b\u0438 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 map, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c (Functor).<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0442\u043e\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 map, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c (map) \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c.<\/p>\n<p>  <\/p>\n<pre><code>const add1 = (a) =&gt; a+1; let myArray = new Array(1, 2, 3, 4); \/\/\u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f myArray.map(add1) \/\/ -&gt; [2,3,4,5] \/\/\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u2014 MyFunctor. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e JS-\u043a\u043b\u0430\u0441\u0441 (\u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 map. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 Myfunctor \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<pre><code>const add1 = (a) =&gt; a + 1; class MyFunctor { \/\/\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440   constructor(value) {     this.val = value;   }   map(fn) {   \/\/\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a this.val + \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 Myfunctor    return new Myfunctor(fn(this.val));   } } \/\/temp \u2014 \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1 let temp = new MyFunctor(1);  temp.map(add1) \/\/-&gt; temp \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c (map) &quot;add1&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>P. S. \u0424\u0443\u043d\u043a\u0442\u043e\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (<a href=\"https:\/\/github.com\/fantasyland\/fantasy-land\">Fantasy-land<\/a>) \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a map, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  <\/p>\n<h4 id=\"monady\">\u041c\u043e\u043d\u0430\u0434\u044b<\/h4>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u044b \u0442\u043e\u0436\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b, \u0442. \u0435. \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <strong>map<\/strong>. \u041d\u043e \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043d\u043e\u0432\u0430 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u0442\u0435 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u043c\u043e\u043d\u0430\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/fantasyland\/fantasy-land#apply\">Apply<\/a> (\u043c\u0435\u0442\u043e\u0434 <strong>ap<\/strong>), <a href=\"https:\/\/github.com\/fantasyland\/fantasy-land#applicative\">Applicative<\/a> (\u043c\u0435\u0442\u043e\u0434\u044b <strong>ap<\/strong> \u0438 <strong>of<\/strong>) \u0438 <a href=\"https:\/\/github.com\/fantasyland\/fantasy-land#chain\">Chain<\/a> (\u043c\u0435\u0442\u043e\u0434 <strong>chain<\/strong>).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/84a\/91e\/ab1\/84a91eab1eaa4bc0adf68067409ac24e.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p><em><strong>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/strong>. \u0412 JS \u043c\u043e\u043d\u0430\u0434\u044b \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b map, ap, of \u0438 chain, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438.<\/em><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u043d\u0430\u0434.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u041c\u043e\u043d\u0430\u0434\u0430 \u2014 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 class Monad {     constructor(val) {         this.__value = val;     }     static of(val) {\/\/Monad.of \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c new Monad(val)         return new Monad(val);     };     map(f) {\/\/\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443!         return Monad.of(f(this.__value));     };     join() { \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u043d\u0430\u0434\u044b         return this.__value;     };     chain(f) {\/\/\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0430\u044f (map), \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0449\u0430\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435         return this.map(f).join();     };      ap(someOtherMonad) {\/\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438         return someOtherMonad.map(this.__value);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Maybe \u0438\u043b\u0438 Either.<\/p>\n<p>  <\/p>\n<p><strong>\u041c\u043e\u043d\u0430\u0434\u0430 Maybe<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 Maybe \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u043e\u043d\u0430\u0434\u044b. \u041d\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f null \u0438\u043b\u0438 undefined.<\/p>\n<p>  <\/p>\n<p><strong>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f null \u0438\u043b\u0438 undefined, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f map \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 null \u0438 undefined.<\/strong> \u0422\u0430\u043a\u0430\u044f \u043c\u043e\u043d\u0430\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 null-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 ramda-fantasy \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u043d\u0430\u0434\u044b Maybe. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 <strong>Just<\/strong> \u0438\u043b\u0438 <strong>Nothing<\/strong> (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u0438\u043b\u0438 null\/undefined).<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u044f \u043c\u0435\u0442\u043e\u0434\u044b <strong>Just<\/strong> \u0438 <strong>Nothing<\/strong> \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b (map, orElse \u0438 \u0442. \u0434.), Just \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u0430 Nothing \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u043e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b map \u0438 orElse \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435:<\/strong><\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Maybe \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ramda-fantasy \/\/\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: https:\/\/github.com\/ramda\/ramda-fantasy\/blob\/master\/src\/Maybe.js  function Maybe(x) { \/\/&lt;-- \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u043d\u0430\u0434\u0443 Maybe \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430 Just \u0438\u043b\u0438 Nothing   return x == null ? _nothing : Maybe.Just(x); }  function Just(x) {   this.value = x; } util.extend(Just, Maybe);  Just.prototype.isJust = true; Just.prototype.isNothing = false;  function Nothing() {} util.extend(Nothing, Maybe);  Nothing.prototype.isNothing = true; Nothing.prototype.isJust = false;  var _nothing = new Nothing();  Maybe.Nothing = function() {   return _nothing; };  Maybe.Just = function(x) {   return new Just(x); };  Maybe.of = Maybe.Just;  Maybe.prototype.of = Maybe.Just;  \/\/ \u0444\u0443\u043d\u043a\u0442\u043e\u0440 Just.prototype.map = function(f) { \/\/\u0414\u0435\u043b\u0430\u0435\u0442 map, \u043a\u043e\u0433\u0434\u0430 Just \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Just \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430   return this.of(f(this.value)); };  Nothing.prototype.map = util.returnThis; \/\/ &lt;-- \u0414\u0435\u043b\u0430\u0435\u0442 map, \u043a\u043e\u0433\u0434\u0430 Nothing \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442  Just.prototype.getOrElse = function() {   return this.value; };  Nothing.prototype.getOrElse = function(a) {   return a; };  module.exports = Maybe;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0443 Maybe \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u043d\u0430 null.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0439\u0434\u0451\u043c \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null \u0438\u043b\u0438 \u0438\u043c\u0435\u0442\u044c null-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442-\u043c\u043e\u043d\u0430\u0434\u0443.<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 ramdajs, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Maybe \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043c\u043e\u043d\u0430\u0434\u044b.<\/li>\n<li>\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f null (\u0442. \u0435. \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c null-\u043e\u0448\u0438\u0431\u043a\u0438).<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code>\/\/\u042d\u0442\u0430\u043f 1. \u0412\u043c\u0435\u0441\u0442\u043e... if (user == null) { \/\/\u043d\u0435 \u0437\u0430\u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d     return indexURLs['en']; \/\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e   }  \/\/\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c:  Maybe(user) \/\/\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Maybe({userObj}) \u0438\u043b\u0438 Maybe(null). \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u044b \u0412\u041d\u0423\u0422\u0420\u0418 Maybe  \/\/\u042d\u0442\u0430\u043f 2. \u0412\u043c\u0435\u0441\u0442\u043e...  if (user.prefs.languages.primary &amp;&amp; user.prefs.languages.primary != 'undefined') {     if (indexURLs[user.prefs.languages.primary]) {\/\/\u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430,       return indexURLs[user.prefs.languages.primary];  \/\/\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c: \/\/\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0443\u043c\u0435\u044e\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 Maybe, \u0432\u0440\u043e\u0434\u0435 map.path \u0438\u0437 Ramda:  &lt;userMaybe&gt;.map(path(['prefs', 'languages', 'primary']))  \/\/\u042d\u0442\u0430\u043f 3. \u0412\u043c\u0435\u0441\u0442\u043e...  return indexURLs['en']; \/\/hardcoded default values  \/\/\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c: \/\/\u0432\u0441\u0435 Maybe-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u0442\u043e\u0434 orElse \u0438\u043b\u0438 getOrElse, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0440\u043d\u0451\u0442 \u043b\u0438\u0431\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043b\u0438\u0431\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e &lt;userMayBe&gt;.getOrElse('http:\/\/site.com\/en')      <\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"currying-pomogaet-rabotat-s-globalnymi-dannymi-i-multiparametricheskimi-funkciyami\">Currying \u200a(\u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438)<\/h2>\n<p>  <\/p>\n<p><strong><em>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f: \u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (Pure functions) \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f (Composition)<\/em><\/strong><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 func1.func2.func3 \u0438\u043b\u0438 (func1(func2(func3())), \u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 func2 \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u2014 func2(param1, param2), \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0451 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443!<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0432\u0435\u0434\u044c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0435\u0440\u0443\u0442 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (Currying).<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0431\u0435\u0440\u0443\u0449\u0435\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0431\u0435\u0440\u0443\u0449\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>  <\/p>\n<p><strong><em>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c, \u0442. \u0435. \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u00ab\u0447\u0438\u0441\u0442\u043e\u00bb.<\/em><\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043d\u043e\u0432\u0430 \u043d\u0430 \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u041d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438  \/\/\u0413\u043b\u043e\u0431\u0430\u043b indexURLs \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 let indexURLs = {     'en': 'http:\/\/mysite.com\/en',  \/\/English     'sp': 'http:\/\/mysite.com\/sp', \/\/Spanish     'jp': 'http:\/\/mysite.com\/jp'   \/\/Japanese }  \/\/\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 const getUrl = (language) =&gt; allUrls[language]; \/\/\u041f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0433\u0440\u044f\u0437\u043d\u043e (\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439), \u0438 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a  \/\/\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435  \/\/\u0414\u043e \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: const getUrl = (allUrls, language) =&gt; {     return Maybe(allUrls[language]); }  \/\/\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: const getUrl = R.curry(function(allUrls, language) {\/\/curry \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043e\u0434\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c     return Maybe(allUrls[language]); });  const maybeGetUrl = getUrl(indexURLs) \/\/\u0425\u0440\u0430\u043d\u0438\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 curried \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.  \/\/\u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 maybeGetUrl \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (\u044f\u0437\u044b\u043a). \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 maybe(user).chain(maybeGetUrl).bla.bla<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"primer-2-rabota-s-kidayuschimi-oshibki-funkciyami-i-vyhod-nemedlenno-posle-vozniknoveniya-oshibki\">\u041f\u0440\u0438\u043c\u0435\u0440 2. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u0438\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0432\u044b\u0445\u043e\u0434 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438<\/h2>\n<p>  <\/p>\n<p><strong><em>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f: \u043c\u043e\u043d\u0430\u0434\u0430 Either<\/em><\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 Maybe \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00ab\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b Null-\u043e\u0448\u0438\u0431\u043e\u043a. \u041d\u043e \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0451\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043a\u0438\u0434\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438? \u0418 \u043a\u0430\u043a \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0438\u043d\u0443\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439? \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 (fast-failure).<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0430 <strong>func1.func2.func3\u2026<\/strong>, \u0438 \u0435\u0441\u043b\u0438 <strong>func2<\/strong> \u043a\u0438\u043d\u0443\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c <strong>func3<\/strong> \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u0437 <strong>func2<\/strong> \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"monada-either\">\u041c\u043e\u043d\u0430\u0434\u0430 Either<\/h2>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u044b Either \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0433\u0434\u0430 \u043b\u044e\u0431\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u043a\u0438\u043d\u0443\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0439\u0442\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435: \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <strong>tax<\/strong> \u0438 <strong>discount<\/strong> \u0434\u043b\u044f <strong>item\u2019\u043e\u0432<\/strong> \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c <strong>showTotalPrice<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f tax \u043a\u0438\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0435. \u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043a\u0438\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f discount. \u041d\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, discount \u043a\u0438\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0446\u0435\u043d\u0430 item\u2019\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 10.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 <strong>showTotalPrice<\/strong> \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \/\/\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0443, \u043b\u0438\u0431\u043e \u0446\u0435\u043d\u0443 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043d\u0430\u043b\u043e\u0433\u0430  const tax = (tax, price) =&gt; {   if (!_.isNumber(price)) return new Error(&quot;Price must be numeric&quot;);    return price + (tax * price); };  \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0443, \u043b\u0438\u0431\u043e \u0446\u0435\u043d\u0443 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0441\u043a\u0438\u0434\u043a\u0438 const discount = (dis, price) =&gt; {   if (!_.isNumber(price)) return (new Error(&quot;Price must be numeric&quot;));    if (price &lt; 10) return new Error(&quot;discount cant be applied for items priced below 10&quot;);    return price - (price * dis); };  const isError = (e) =&gt; e &amp;&amp; e.name == 'Error';  const getItemPrice = (item) =&gt; item.price;  \/\/\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u0446\u0435\u043d\u0443 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043d\u0430\u043b\u043e\u0433\u0430 \u0438 \u0441\u043a\u0438\u0434\u043a\u0438. \u0414\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. const showTotalPrice = (item, taxPerc, disount) =&gt; {   let price = getItemPrice(item);   let result = tax(taxPerc, price);   if (isError(result)) {     return console.log('Error: ' + result.message);   }   result = discount(discount, result);   if (isError(result)) {     return console.log('Error: ' + result.message);   }   \/\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442   console.log('Total Price: ' + result); }  let tShirt = { name: 't-shirt', price: 11 }; let pant = { name: 't-shirt', price: '10 dollars' }; let chips = { name: 't-shirt', price: 5 }; \/\/less than 10 dollars error  showTotalPrice(tShirt) \/\/ \u0421\u0443\u043c\u043c\u0430: 9,075 showTotalPrice(pant)   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430: \u0446\u0435\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u043c showTotalPrice(chips)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430: \u0441\u043a\u0438\u0434\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0446\u0435\u043d\u0435 \u043d\u0438\u0436\u0435 10<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c <strong>showTotalPrice<\/strong> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u043d\u0430\u0434\u044b Either \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 \u0424\u041f-\u0441\u0442\u0438\u043b\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u0430 Either \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430: Either.Left \u0438 Either.Right. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 Either. <strong>Left \u0438 Right \u2014 \u044d\u0442\u043e \u043c\u043e\u043d\u0430\u0434\u044b! \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438\/\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 Left, \u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u0432 Right.<\/strong> \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Either.Left \u0438\u043b\u0438 Either.Right. <strong>\u0421\u0434\u0435\u043b\u0430\u0432 \u0442\u0430\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c map, chain \u0438 \u0442. \u0434.<\/strong><\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u044f \u0438 <strong>Left<\/strong>, \u0438 <strong>Right<\/strong> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 map, chain \u0438 \u043f\u0440., \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <strong>Left<\/strong> \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u0430 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Right, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  <\/p>\n<p><strong>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439.<\/strong><\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 1.<\/strong> \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 Left \u0438 Right.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u00ab\u043e\u0431\u0435\u0440\u043d\u0451\u043c\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u00bb. \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 new, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<pre><code>var Either = require('ramda-fantasy').Either; var Left = Either.Left; var Right = Either.Right;  const tax = R.curry((tax, price) =&gt; {   if (!_.isNumber(price)) return Left(new Error(&quot;Price must be numeric&quot;)); \/\/&lt;--\u041e\u0431\u0435\u0440\u043d\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 Either.Left    return  Right(price + (tax * price)); \/\/&lt;--\u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 Either.Right });  const discount = R.curry((dis, price) =&gt; {   if (!_.isNumber(price)) return Left(new Error(&quot;Price must be numeric&quot;)); \/\/&lt;--Wrap Error in Either.Left    if (price &lt; 10) return Left(new Error(&quot;discount cant be applied for items priced below 10&quot;)); \/\/&lt;-- \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 Either.Left    return Right(price - (price * dis)); \/\/&lt;--\u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 Either.Right });<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 2.<\/strong> \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 <strong>Right<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c (compose).<\/p>\n<p>  <\/p>\n<p><code>const getItemPrice = (item) =&gt; Right(item.price);<\/code><\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 3.<\/strong> \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043e\u0434\u043d\u0443 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0438\u0445 \u0432 <strong>Either.either<\/strong> (\u0438\u0437 <a href=\"https:\/\/github.com\/ramda\/ramda-fantasy\/blob\/master\/src\/Either.js#L33\">ramda-fantasy.js api<\/a>).<\/p>\n<p>  <\/p>\n<p><strong>Either.either<\/strong> \u0431\u0435\u0440\u0451\u0442 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043c\u043e\u043d\u0430\u0434\u0443 Either. Either \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u0430 Either (\u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440) \u2014 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e Either.either \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 Either \u043b\u0438\u0431\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043b\u0438\u0431\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043a\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Either \u2014 Right \u0438\u043b\u0438 Left.<\/p>\n<p>  <\/p>\n<pre><code>const displayTotal = (total) =&gt; { console.log(\u2018Total Price: \u2018 + total) }; const logError = (error) =&gt; { console.log(\u2018Error: \u2018 + error.message); }; const eitherLogOrShow = Either.either(logError, displayTotal);<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 4.<\/strong> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <strong>chain<\/strong> \u0434\u043b\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 Either.either (eitherLogOrShow), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code>const showTotalPrice = (item) =&gt; eitherLogOrShow(getItemPrice(item).chain(apply25PercDisc).chain(addCaliTax));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code>const tax = R.curry((tax, price) =&gt; {   if (!_.isNumber(price)) return Left(new Error(&quot;Price must be numeric&quot;));    return  Right(price + (tax * price)); });  const discount = R.curry((dis, price) =&gt; {   if (!_.isNumber(price)) return Left(new Error(&quot;Price must be numeric&quot;));    if (price &lt; 10) return Left(new Error(&quot;discount cant be applied for items priced below 10&quot;));    return Right(price - (price * dis)); });  const addCaliTax = (tax(0.1));\/\/\u043d\u0430\u043b\u043e\u0433 10 %  const apply25PercDisc = (discount(0.25));\/\/ \u0441\u043a\u0438\u0434\u043a\u0430 25 %  const getItemPrice = (item) =&gt; Right(item.price);  const displayTotal = (total) =&gt; { console.log('Total Price: ' + total) };  const logError = (error) =&gt; { console.log('Error: ' + error.message); };  const eitherLogOrShow = Either.either(logError, displayTotal);  \/\/api const showTotalPrice = (item) =&gt; eitherLogOrShow(getItemPrice(item).chain(apply25PercDisc).chain(addCaliTax));  let tShirt = { name: 't-shirt', price: 11 }; let pant = { name: 't-shirt', price: '10 dollars' }; \/\/error let chips = { name: 't-shirt', price: 5 }; \/\/less than 10 dollars error  showTotalPrice(tShirt) \/\/ \u0421\u0443\u043c\u043c\u0430: 9,075 showTotalPrice(pant)   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430: \u0446\u0435\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u043c showTotalPrice(chips)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430: \u0441\u043a\u0438\u0434\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0446\u0435\u043d\u0435 \u043d\u0438\u0436\u0435 10<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"primer-3-prisvoenie-znacheniya-potencialnym-null-obektam\">\u041f\u0440\u0438\u043c\u0435\u0440 3. \u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c Null-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c<\/h2>\n<p>  <\/p>\n<p>***\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0424\u041f-\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f: \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (Applicative)<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435:<\/strong> \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043a\u0438\u0434\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u043b\u0441\u044f \u0438 \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u043c\u043e\u0430\u043a\u0446\u0438\u044f (\u0442. \u0435. \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043a\u0438\u0434\u043a\u0430).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0a5\/c88\/1f3\/0a5c881f389540f4bb4118239a6d1488.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <strong>applyDiscount<\/strong>. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043a\u0438\u0434\u0430\u0442\u044c null-\u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c (\u0441\u043b\u0435\u0432\u0430) \u0438\u043b\u0438 \u0441\u043a\u0438\u0434\u043a\u0430 (\u0441\u043f\u0440\u0430\u0432\u0430) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f null.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043a\u0438\u0434\u043a\u0443 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 user, \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0438 \u0441\u043a\u0438\u0434\u043a\u0430. \/\/Null-\u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u0438\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043b\u0438 \u0441\u043a\u0438\u0434\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f null. const applyDiscount = (user, discount) =&gt; {     let userClone = clone(user);\/\/ \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e       userClone.discount = discount.code;    return userClone; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u0410\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (Applicative)<\/strong><\/p>\n<p>  <\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 ap \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e Applicative, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u043c. \u0422\u0430\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 null-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u0441 \u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c) \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u0441 \u043f\u0440\u0430\u0432\u043e\u0439 (\u0441\u043a\u0438\u0434\u043a\u0430).<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u043d\u0430\u0434\u044b Maybe (\u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043c\u043e\u043d\u0430\u0434\u044b) \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e ap, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u043d\u0438 \u0442\u043e\u0436\u0435 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0435, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u043d\u0430\u0434\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u044b Maybe \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 null. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c applyDiscount \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u043d\u0430\u0434\u044b Maybe, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043a\u0430\u043a \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u0430\u044f.<\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 1. \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 null-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u043d\u0430\u0434\u044b Maybe.<\/strong><\/p>\n<p>  <\/p>\n<pre><code>const maybeUser = Maybe(user); const maybeDiscount = Maybe(discount);<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 2. \u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043a\u0430\u0440\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0451, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 \u0437\u0430 \u0440\u0430\u0437.<\/strong><\/p>\n<p>  <\/p>\n<pre><code>\/\/ \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043a\u0430\u0440\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0451, \u0447\u0442\u043e\u0431\u044b \/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 \u0437\u0430 \u0440\u0430\u0437 var applyDiscount = curry(function(user, discount) {             user.discount = discount.code;             return user;  });<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 3. \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0447\u0435\u0440\u0435\u0437 map \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (maybeUser) \u0432 applyDiscount.<\/strong><\/p>\n<p>  <\/p>\n<pre><code>\/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0447\u0435\u0440\u0435\u0437 map \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (maybeUser) \u0432 applyDiscount const maybeApplyDiscountFunc = maybeUser.map(applyDiscount); \/\/\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 applyDiscount \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 map \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (maybeApplyDiscountFunc) \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u043e\u0439 \u0432 \u043c\u043e\u043d\u0430\u0434\u0443 Maybe \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 applyDiscount, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 maybeUser(\u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440).<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u0430\u044f \u0432 \u043c\u043e\u043d\u0430\u0434\u0443!<\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 4. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 maybeApplyDiscountFunc.<\/strong><\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 maybeApplyDiscountFunc \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c:<\/p>\n<p>  <\/p>\n<p>1) \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u043e\u0439 \u0432 Maybe, \u2014 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442;<br \/>  2) Nothing (\u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u043c Maybe) \u2014 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f Nothing, \u0430 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0438\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 null-\u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 maybeApplyDiscountFunc \u0447\u0435\u0440\u0435\u0437 map, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<p><code>maybeDiscount.map(maybeApplyDiscountFunc)! \/\/ \u041f\u0420\u041e\u0411\u041b\u0415\u041c\u0410!<\/code><\/p>\n<p>  <\/p>\n<p><strong>\u041e\u0439-\u0451\u0439: map \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e (maybeApplyDiscountFunc), \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 Maybe!<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044e. \u0418 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u2014 ap!<\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 5.<\/strong> \u041e\u0441\u0432\u0435\u0436\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ap. \u041c\u0435\u0442\u043e\u0434 ap \u0431\u0435\u0440\u0451\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0443 Maybe \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\/\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0435\u0439 \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e \u0438\u043c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<pre><code>class Maybe {   constructor(val) {     this.val = val;   }   ...   ...   \/\/ap \u0431\u0435\u0440\u0451\u0442 \u0434\u0440\u0443\u0433\u0443\u044e maybe \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0435\u0439 \u0445\u0440\u0430\u043d\u044f\u0449\u0443\u044e\u0441\u044f \u0432 \u043d\u0451\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e.   \/\/this.val \u0414\u041e\u041b\u0416\u0415\u041d \u0431\u044b\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u043b\u0438 Nothing (\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438\u043b\u0438 \u0447\u0438\u0441\u043b\u043e\u043c)   ap(differentMayBe) {       return differentMayBe.map(this.val);    } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c (ap) maybeApplyDiscountFunc \u043a maybeDiscount \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f map, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435. \u0418 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c!<\/p>\n<p>  <\/p>\n<pre><code>maybeApplyDiscountFunc.ap(maybeDiscount) \/\/\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 applyDiscount \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 this.val \u0432 \u043e\u0431\u0451\u0440\u0442\u043a\u0435 maybeApplyDiscountFunc: maybeDiscount.map(applyDiscount) \/\/\u0414\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 maybeDiscount \u0438\u043c\u0435\u0435\u0442 \u0441\u043a\u0438\u0434\u043a\u0443, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 maybeDiscount \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Null, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Fantasy Land \u0432\u043d\u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435. \u0412 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c: Just(f).ap(Just(x)), \u0433\u0434\u0435 f \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0445 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c Just(x).ap(Just(f)). \u041d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c. \u0421\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/medium.com\/@keithalexander\">keithalexander<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0440\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0451, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0432\u043d\u0443\u0442\u0440\u044c Maybe. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0432 Maybe \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c ap.<\/p>\n<p>  <\/p>\n<h2 id=\"funkciya-curryn\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f curryN<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0431\u0440\u0430\u043b\u0430 \u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0440\u0430\u0437\u0443, \u0430 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: const add = (a, b) =&gt;a+b; const curriedAdd = R.curry(add); const add10 = curriedAdd(10);\/\/\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0431\u0435\u0440\u0443\u0449\u0443\u044e \u0432\u0442\u043e\u0440\u043e\u0439 (b) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \/\/\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. add10(2) \/\/ -&gt; 12 \/\/\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 add \u0441 10 \u0438 2.<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u0435\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>add<\/strong> \u043c\u043e\u0433\u043b\u0430 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u043d\u0435\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432?<\/p>\n<p>  <\/p>\n<p><code>const add = (...args) =&gt; R.sum(args); \/\/\u0421\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445<\/code><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u043c \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>curryN<\/strong>:<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u043f\u0440\u0438\u043c\u0435\u0440 curryN const add = (...args) =&gt; R.sum(args); \/\/\u043f\u0440\u0438\u043c\u0435\u0440 CurryN: const add = (...args) =&gt; R.sum(args); const add3Numbers = R.curryN(3, add); const add5Numbers = R.curryN(5, add); const add10Numbers = R.curryN(10, add); add3Numbers(1,2,3) \/\/ 6 add3Numbers(1) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0431\u0435\u0440\u0443\u0449\u0443\u044e \u0435\u0449\u0451 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. add3Numbers(1, 2) \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0431\u0435\u0440\u0443\u0449\u0443\u044e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"ispolzovanie-curryn-dlya-ozhidaniya-kolichestva-vyzovov-funkcii\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 curryN \u0434\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0438\u0448\u0435\u0442 \u0432 \u043b\u043e\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0435\u0451 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 (\u043e\u0434\u0438\u043d \u0438 \u0434\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0433\u0440\u044f\u0437\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 let counter = 0; const logAfter3Calls = () =&gt; {  if(++counter == 3)    console.log('called me 3 times'); } logAfter3Calls() \/\/ \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 logAfter3Calls() \/\/ \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 logAfter3Calls() \/\/ 'called me 3 times'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u043c \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e curryN.<\/p>\n<p>  <\/p>\n<pre><code>\/\/\u0447\u0438\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 const log = () =&gt; {    console.log('called me 3 times'); } const logAfter3Calls = R.curryN(3, log); \/\/\u0432\u044b\u0437\u043e\u0432 logAfter3Calls('')('')('')\/\/'called me 3 times' \/\/\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c '', \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c CurryN \u0444\u0430\u043a\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443 \u043f\u0440\u0438 \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438.<\/strong><\/p>\n<p>  <\/p>\n<h2 id=\"primer-4-sbor-i-otobrazhenie-oshibok\">\u041f\u0440\u0438\u043c\u0435\u0440 4. \u0421\u0431\u043e\u0440 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a<\/h2>\n<p>  <\/p>\n<p><strong><em>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f: \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0442\u043e\u0440 Validation, \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c Validation, \u043c\u043e\u043d\u0430\u0434\u0430 Validation).<\/em><\/strong><\/p>\n<p>  <\/p>\n<p><strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f\u043c\u0438<\/strong> \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <strong>\u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c Validation (Validation Applicative)<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ap (apply).<\/p>\n<p>  <\/p>\n<p><strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/strong> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b <strong>\u043c\u043e\u043d\u0430\u0434\u0430\u043c Either<\/strong> \u0438 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Either, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 chain, \u0432 \u043c\u043e\u043d\u0430\u0434\u0430\u0445 Validation \u043c\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 ap. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 chain \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e <strong>ap, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043c\u043e\u043d\u0430\u0434\u0430\u0445 Validation, \u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/strong><\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u043c\u043e\u043d\u0430\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c \u0432\u0432\u043e\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. <\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435:<\/strong> \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u043f\u043e\u0447\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0440\u0451\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (isUsernameValid, isPwdLengthCorrect \u0438 ieEmailValid). \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/e99\/dc5\/390\/e99dc539079c45f8bba87f8eb578e612.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c Validation. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Validation.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0438\u0437 <a href=\"https:\/\/github.com\/folktale\/data.validation\">folktalejs<\/a> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 data.validation, \u0432 ramda-fantasy \u043e\u043d\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430. \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 Either \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430: <strong>Success<\/strong> \u0438 <strong>Failure<\/strong>. \u042d\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Either.<\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 1.<\/strong> \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b <strong>Success<\/strong> \u0438 <strong>Failure<\/strong> (\u0442. \u0435. \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432).<\/p>\n<p>  <\/p>\n<pre><code>const Validation = require('data.validation') \/\/\u0438\u0437 folktalejs const Success = Validation.Success const Failure = Validation.Failure const R = require('ramda'); \/\/\u0432\u043c\u0435\u0441\u0442\u043e: function isUsernameValid(a) {     return \/^(0|[1-9][0-9]*)$\/.test(a) ?             [&quot;Username can't be a number&quot;] : a } \/\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c: function isUsernameValid(a) {     return \/^(0|[1-9][0-9]*)$\/.test(a) ?           Failure([&quot;Username can't be a number&quot;]) : Success(a) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438.<\/strong><\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 2.<\/strong> \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e (dummy function) \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<p><code>const returnSuccess = () =&gt; 'success';\/\/\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 success<\/code><\/p>\n<p>  <\/p>\n<p><strong>\u042d\u0442\u0430\u043f 3. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c curryN \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f ap<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421 ap \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043b\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c (\u0438\u043b\u0438 \u043c\u043e\u043d\u0430\u0434\u043e\u0439), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ap. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 monad1 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0418 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 monad1.ap(monad2), \u0442. \u0435. <strong>resultingMonad<\/strong>, \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u043e\u0439 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ap \u043a monad3.<\/p>\n<p>  <\/p>\n<pre><code>let finalResult = monad1.ap(monad2).ap(monad3) \/\/\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a let resultingMonad = monad1.ap(monad2) let finalResult = resultingMonad.ap(monad3) \/\/\u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 monad1 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 monad1.ap(monad2) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u043d\u0430\u0434\u043e\u0439 (resultingMonad) \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u0432\u0430\u0436\u0434\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ap, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0435 \u043c\u043e\u043d\u0430\u0434\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443 \u043d\u0430\u0441 \u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ap.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435.<\/p>\n<p>  <\/p>\n<pre><code>         Success(returnSuccess)         .ap(isUsernameValid(username)) \/\/\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442         .ap(isPwdLengthCorrect(pwd))\/\/\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442         .ap(ieEmailValid(email))\/\/\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c Success(returnSuccess).ap(isUsernameValid(username)) \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ap \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c curryN, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 N \u0440\u0430\u0437.<\/p>\n<p>  <\/p>\n<pre><code>\/\/3 \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c ap \u0442\u0440\u0438 \u0440\u0430\u0437\u0430. let success = R.curryN(3, returnSuccess);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0440\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f <strong>success \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0440\u0438 \u0440\u0430\u0437\u0430<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code>function validateForm(username, pwd, email) {     \/\/3 \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c ap \u0442\u0440\u0438 \u0440\u0430\u0437\u0430.     let success = R.curryN(3, returnSuccess);     return Success(success)\/\/ \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0440\u0451\u0445 ap         .ap(isUsernameValid(username))         .ap(isPwdLengthCorrect(pwd))         .ap(ieEmailValid(email)) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code>const Validation = require('data.validation') \/\/\u0438\u0437 folktalejs const Success = Validation.Success const Failure = Validation.Failure const R = require('ramda');  function isUsernameValid(a) {     return \/^(0|[1-9][0-9]*)$\/.test(a) ? Failure([&quot;Username can't be a number&quot;]) : Success(a) }  function isPwdLengthCorrect(a) {     return a.length == 10 ? Success(a) : Failure([&quot;Password must be 10 characters&quot;]) }  function ieEmailValid(a) {     var re = \/^(([^&lt;&gt;()\\[\\]\\\\.,;:\\s@&quot;]+(\\.[^&lt;&gt;()\\[\\]\\\\.,;:\\s@&quot;]+)*)|(&quot;.+&quot;))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$\/;      return re.test(a) ? Success(a) : Failure([&quot;Email is not valid&quot;]) }  const returnSuccess = () =&gt; 'success';\/\/\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 success  function validateForm(username, pwd, email) {     let success = R.curryN(3, returnSuccess);\/\/ 3 \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c ap \u0442\u0440\u0438 \u0440\u0430\u0437\u0430.     return Success(success)         .ap(isUsernameValid(username))         .ap(isPwdLengthCorrect(pwd))         .ap(ieEmailValid(email)) }  validateForm('raja', 'pwd1234567890', 'r@r.com').value; \/\/Output: success  validateForm('raja', 'pwd', 'r@r.com').value; \/\/Output: ['Password must be 10 characters' ]  validateForm('raja', 'pwd', 'notAnEmail').value; \/\/Output: ['Password must be 10 characters', 'Email is not valid']  validateForm('123', 'pwd', 'notAnEmail').value; \/\/['Username can\\'t be a number', 'Password must be 10 characters', 'Email is not valid']<\/code><\/pre>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/327522\/\"> https:\/\/habrahabr.ru\/post\/327522\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/89a\/77b\/f22\/89a77bf2292f4c58addca4905d5a6d0f.jpg\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0424\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 (\u0424\u041f) \u043c\u043e\u0436\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0430\u0448 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u041d\u043e \u0424\u041f \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0435 \u0443\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c, \u043a\u0430\u043a \u043c\u043e\u043d\u0430\u0434\u044b (Monads), \u0430\u043f\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (Applicative) \u0438 \u0442. \u0434., \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u043c \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0449\u043d\u044b\u0445 \u0424\u041f-\u043c\u0435\u0442\u043e\u0434\u0438\u043a. \u042f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0443\u043f\u0443\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c: \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0434\u0435\u043b\u0430\u043d \u0443\u043f\u043e\u0440 \u043d\u0430 \u0442\u043e\u043c, <strong>\u0417\u0410\u0427\u0415\u041c<\/strong> \u043d\u0443\u0436\u043d\u0430 \u0444\u0438\u0447\u0430 \u0425, \u0430 \u043d\u0435 \u043d\u0430 \u0442\u043e\u043c, <strong>\u0427\u0422\u041e<\/strong> \u0442\u0430\u043a\u043e\u0435 \u0444\u0438\u0447\u0430 \u0425.<\/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-285683","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285683","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=285683"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285683\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=285683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=285683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=285683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}