{"id":346142,"date":"2023-03-02T09:01:40","date_gmt":"2023-03-02T09:01:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=346142"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=346142","title":{"rendered":"<span>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u2014 \u0432\u0435\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u044c Scala\u2019\u043b\u0430\u0437\u043e\u0432: \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u041a\u0440\u0438\u043f\u0442\u043e\u043d\u0438\u0442\u00bb \u0438 \u043f\u0438\u0448\u0443 \u043d\u0430 Scala. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0430\u0440\u0435 \u043b\u0430\u0439\u0444\u0445\u0430\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043d\u0435 \u0437\u0430\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u043d \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0411\u0443\u0434\u044c \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u0438\u043b\u0438 \u0441\u044b\u0440\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043d\u0435\u0432\u0430\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u0432 Scala \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u0438\u0451\u043c\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <em>\u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0438 \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u0451\u043c \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u043d\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 (\u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0435 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u0430 \u0438\u0434\u0435\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 <a href=\"https:\/\/lexi-lambda.github.io\/blog\/2019\/11\/05\/parse-don-t-validate\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 Scala 3 (\u0432\u0435\u0440\u0441\u0438\u044f 3.2.2) \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 Scala 2 (\u0432\u0435\u0440\u0441\u0438\u044f 2.13.10).<\/p>\n<h2>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u00ab\u0447\u0438\u0441\u0442\u044b\u0435\u00bb \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/h2>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u044d\u0442\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <code>String<\/code> \u2014 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0432 Scala. \u041a\u0430\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442? \u0414\u0430 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u044b \u043c\u0438\u0440\u0430 \u0438 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>\u00ab\u20ac\u2021\u2122\u00b5\u00bb<\/code><\/p>\n<pre><code class=\"scala\">val str: String = \"\u20ac\u2021\u2122\u00b5\"<\/code><\/pre>\n<blockquote>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0444\u0440\u0430\u0437\u0443 <a href=\"https:\/\/github.com\/kenbot\">Ken Scambler<\/a>, \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e <a href=\"https:\/\/www.youtube.com\/watch?v=zExb9x3fzKs&amp;t=52s\">\u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e<\/a>: \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043b\u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043d\u0438\u0433 \u0428\u0435\u043a\u0441\u043f\u0438\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442\u0438\u043f\u0430 <code>String<\/code>?!<\/p>\n<\/blockquote>\n<p>\u0412 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0430\u043a\u0430\u044f \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u0430\u00bb \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0431\u044b \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u043b\u044e\u0434\u0435\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435\u0439 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u0435\u043d \u2014 <code>\u0410\u043b\u0451\u043d\u0430<\/code>, \u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u2014 \u043d\u0435\u0442: <code>\u20ac\u2021\u2122\u00b5<\/code>, <code>12345<\/code>, <code>Alyona<\/code>, <code>\u0410\u043b\u0451\u043d\u043018<\/code>, <code>\u0430\u043b\u0451\u043d\u0430<\/code>.<\/p>\n<p>\u041d\u043e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u0442\u0438\u043f <code>String<\/code>.\u00a0 \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043d\u043e \u0435\u0449\u0451 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0447\u0442\u043e \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0451\u0442\u043a\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439?<\/p>\n<p>\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u0438 \u00ab\u0447\u0438\u0441\u0442\u044b\u0435\u00bb case \u043a\u043b\u0430\u0441\u0441\u044b (\u0438\u043b\u0438 <a href=\"https:\/\/docs.scala-lang.org\/overviews\/core\/value-classes.html\">\u043a\u043b\u0430\u0441\u0441\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/a>) \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u201c\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443\u201d \u043d\u0430\u0434 <code>String<\/code>, \u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u00ab\u043f\u043e\u0434\u043b\u043e\u0436\u0438\u0442\u044c\u00bb \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"scala\">opaque type Name = String val name: Name = \"\u20ac\u2021\u2122\u00b5\" \/\/ val name: Name = \u20ac\u2021\u2122\u00b5<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/j3H5VznPQUOz6ylAQgFMoA\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4ojla7AbTCe4lw8EdHdTMw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2<\/a><\/p>\n<pre><code class=\"scala\">case class Name(value: String) extends AnyVal val name: Name = Name(\"\u20ac\u2021\u2122\u00b5\") \/\/ val name: Name = Name(\u20ac\u2021\u2122\u00b5)<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/CjZpe7ejSwW724prXkQLqg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/69prW6KjRG6MPcL9fJSObw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2<\/a><\/p>\n<p>\u00a0\u00ab\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435\u00bb \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>Name<\/code> \u043f\u0443\u0442\u0451\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>Name<\/code> \u0432 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435:<\/p>\n<pre><code class=\"scala\">import scala.util.matching.Regex  final case class Name private (value: String) extends AnyVal  object Name:   private val pattern: Regex = \"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\".r    def fromString(str: String): Option[Name] =     if pattern.matches(str) then Some(Name(str))     else None<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u0438\u043c\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440:<\/p>\n<pre><code class=\"scala\">val name: Name = Name(\"\u20ac\u2021\u2122\u00b5\") \/\/ \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/code><\/pre>\n<p>\u0410 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e:<\/p>\n<pre><code class=\"scala\">Name.fromString(\"\u20ac\u2021\u2122\u00b5\")     \/\/ None Name.fromString(\"12345\")    \/\/ None Name.fromString(\"Alyona\")   \/\/ None Name.fromString(\"\u0410\u043b\u0451\u043d\u043018\")  \/\/ None Name.fromString(\"\u0430\u043b\u0451\u043d\u0430\")    \/\/ None Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\")    \/\/ Some(Name(\u0410\u043b\u0451\u043d\u0430))<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/Esu8N76RQO6s0kORDsW1Kg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<blockquote>\n<p>\u0412 Scala 2 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043e\u0436\u043d\u043e \u201c\u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c\u201d \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>copy<\/code> (\u0432 Scala 3 \u044d\u0442\u0443 \u043b\u0430\u0437\u0435\u0439\u043a\u0443 \u0443\u0431\u0440\u0430\u043b\u0438):<\/p>\n<p><code>Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\").map(_.copy(\"\u20ac\u2021\u2122\u00b5\")) \/\/ Some(Name(\u20ac\u2021\u2122\u00b5))<\/code><\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 copy \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Scala 2 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a <code>sealed abstract<\/code>, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p><code>sealed abstract case class Name private (value: String) extends AnyVal<\/code><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/JjnQcld3S9iPVoz1isQKqA\">\u041f\u0440\u0438\u043c\u0435\u0440 \u201c\u0432\u0437\u043b\u043e\u043c\u0430\u201d \u0447\u0435\u0440\u0435\u0437 copy \u0432 Scala 2 \u043d\u0430 Scastie<\/a><\/p>\n<\/blockquote>\n<h2>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b<\/h2>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438: <a href=\"https:\/\/github.com\/Iltotore\/iron\"><strong>iron<\/strong><\/a> (\u0434\u043b\u044f Scala 3) \u0438\u00a0 <a href=\"https:\/\/github.com\/fthomas\/refined\"><strong>refined<\/strong><\/a> (\u0434\u043b\u044f Scala 2).<\/p>\n<p>\u0412 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Type_theory\">\u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432<\/a> \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Refinement_type\">\u00ab\u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f\u00bb (refinement type)<\/a> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f, \u0441\u043d\u0430\u0431\u0436\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f + \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \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\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0431\u044b\u043b\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u0424\u0440\u0438\u043c\u0430\u043d\u043e\u043c \u0438 \u041f\u0444\u0435\u043d\u043d\u0438\u043d\u0433\u043e\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 1991 \u0433\u043e\u0434\u0430 <a href=\"https:\/\/www.cs.cmu.edu\/~fp\/papers\/pldi91.pdf\">\u00ab\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f ML\u00bb<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Standard ML.<\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0438\u0434\u0435\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scala \u0431\u044b\u043b\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0430 Flavio W. Brasil \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/fwbrasil\/bond\"><strong>bond<\/strong><\/a>.<\/p>\n<p>\u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/fthomas\/refined\"><strong>refined<\/strong><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u00a0<a href=\"http:\/\/nikita-volkov.github.io\/refined\/\"> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 Haskell\u00a0<\/a> \u041d\u0438\u043a\u0438\u0442\u044b \u0412\u043e\u043b\u043a\u043e\u0432\u0430.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/Iltotore\/iron\"><strong>iron<\/strong><\/a> \u2014 \u044d\u0442\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0438\u0434\u0435\u0438 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432 Scala 3.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 <a href=\"https:\/\/docs.scala-lang.org\/scala3\/book\/first-look-at-types.html\">\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 Scala<\/a>:<\/p>\n<p><code>Long<\/code> (\u043e\u0442 <code>-2^63<\/code> \u0434\u043e <code>2^63 - 1<\/code>) -> <code>Int<\/code> (\u043e\u0442 <code>-2^31<\/code> \u0434\u043e <code>2^31 - 1<\/code>) -> <code>Short<\/code> (\u043e\u0442 <code>-2^15<\/code> \u0434\u043e <code>2^15 - 1<\/code>) -> <code>Byte<\/code> (\u043e\u0442 <code>-2^7<\/code> \u0434\u043e <code>2^7 - 1<\/code>)<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439.<\/p>\n<h2>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 iron \u0438 refined<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>iron<\/strong> (Scala 3) \u0438 <strong>refined<\/strong> (Scala 2).<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>iron<\/strong>:<\/p>\n<pre><code class=\"scala\">import io.github.iltotore.iron.* import io.github.iltotore.iron.constraint.string.*  opaque type Name = String :| Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>refined<\/strong>:<\/p>\n<pre><code class=\"scala\">import eu.timepit.refined.api.Refined import eu.timepit.refined.string.MatchesRegex  type Name = String Refined MatchesRegex[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/pre>\n<p>\u042f\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">val name0: Name = \"\u20ac\u2021\u2122\u00b5\"    \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name1: Name = \"12345\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name2: Name = \"Alyona\"  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name3: Name = \"\u0410\u043b\u0451\u043d\u043018\" \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name4: Name = \"\u0430\u043b\u0451\u043d\u0430\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name5: Name = \"\u0410\u043b\u0451\u043d\u0430\"   \/\/ \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4zUXqnzARFWscb44XGlLBw\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/OwN8IzucSCuJ3LsBmaxL7A\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 <a href=\"https:\/\/www.scala-lang.org\/api\/3.2.2\/scala\/Option.html\">Option[T]<\/a> (refineOption \u0434\u043b\u044f <strong>iron<\/strong> \/ unapply \u0432 <strong>refined<\/strong>):<\/p>\n<pre><code class=\"scala\">val name0: Option[Name] = \"\u20ac\u2021\u2122\u00b5\".refineOption     \/\/ None val name1: Option[Name] = \"12345\".refineOption    \/\/ None val name2: Option[Name] = \"Alyona\".refineOption   \/\/ None val name3: Option[Name] = \"\u0410\u043b\u0451\u043d\u043018\".refineOption  \/\/ None val name4: Option[Name] = \"\u0430\u043b\u0451\u043d\u0430\".refineOption    \/\/ None val name5: Option[Name] = \"\u0410\u043b\u0451\u043d\u0430\".refineOption    \/\/ Some(\"\u0410\u043b\u0451\u043d\u0430\")<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/w6nxgVi4RHySQg6wGglUlQ\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/e1JE6BfaRBG8cBAEqvshYg\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u0438 \u0432 <a href=\"https:\/\/www.scala-lang.org\/api\/3.2.2\/scala\/util\/Either.html\">Either[String, T]<\/a>, \u0433\u0434\u0435 \u0441\u043b\u0435\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, (refineEither \u0434\u043b\u044f <strong>iron<\/strong> \/ from \u0432 <strong>refined<\/strong>):<\/p>\n<pre><code class=\"scala\">val name0: Either[String, Name] = \"\u20ac\u2021\u2122\u00b5\".refineEither     \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name1: Either[String, Name] = \"12345\".refineEither    \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name2: Either[String, Name] = \"Alyona\".refineEither   \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name3: Either[String, Name] = \"\u0410\u043b\u0451\u043d\u043018\".refineEither  \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name4: Either[String, Name] = \"\u0430\u043b\u0451\u043d\u0430\".refineEither    \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name5: Either[String, Name] = \"\u0410\u043b\u0451\u043d\u0430\".refineEither    \/\/ Right(\"\u0410\u043b\u0451\u043d\u0430\")<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/cXvITTPiT4a27t8pU9m0fg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/GHkxyKFNRzCttHVgwSiFbw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p><em>\u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/em><\/p>\n<p>\u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0442 <a href=\"https:\/\/iltotore.github.io\/iron\/io\/github\/iltotore\/iron\/constraint.html\">\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 <strong>iron<\/strong><\/a>, \u0430 \u0432\u043e\u0442<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fthomas\/refined#provided-predicates\">\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 refined<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/iltotore.github.io\/iron\/docs\/reference\/refinement.html\">\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 iron<\/a> \u0438 <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fthomas\/refined#more-examples\">\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 refined<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410 \u0432 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/h2>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439\u00bb \u2014 <code>case class Name private (value: String) extends AnyVal<\/code><\/p>\n<\/li>\n<li>\n<p>\u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 <code>opaque type Name = String :| Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0432 \u0447\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438? \u0422\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0432 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432?<\/p>\n<p><strong><em>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432<\/em><\/strong><\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <strong>iron<\/strong>\/<strong>refined<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u201c\u0442\u0438\u043f\u044b \u0432\u0440\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443\u0442\u201d.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 case \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"scala\">Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\").get.value \/\/ val res0: String = \u0410\u043b\u0451\u043d\u0430<\/code><\/pre>\n<p>\u041c\u044b \u043e\u043f\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0448\u0438\u0440\u043e\u043a\u043e\u0435\u00bb \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0418 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Name.value<\/code> \u0432 \u043a\u043e\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>String<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0430\u044f \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0436\u0435 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"scala\">val name: Name = \"\u0410\u043b\u0451\u043d\u0430\" \/\/ val name: Name = \u0410\u043b\u0451\u043d\u0430<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043a\u043e\u0434\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; <code>String<\/code>) \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f:<\/p>\n<pre><code class=\"scala\">val name: Name = \"\u0410\u043b\u0451\u043d\u0430\" def printT[T >: String](t: T): Unit = println(t) printT(name) \/\/ \u041f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \"\u0410\u043b\u0451\u043d\u0430\"<\/code><\/pre>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f <a href=\"https:\/\/blog.colinbreck.com\/on-eliminating-error-in-distributed-software-systems\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><strong><em>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/em><\/strong><\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"scala\">val name0: Name = \"\u20ac\u2021\u2122\u00b5\"    \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name1: Name = \"12345\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name2: Name = \"Alyona\"  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name3: Name = \"\u0410\u043b\u0451\u043d\u043018\" \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name4: Name = \"\u0430\u043b\u0451\u043d\u0430\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name5: Name = \"\u0410\u043b\u0451\u043d\u0430\"   \/\/ \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 <code>\"\u0410\u043b\u0451\u043d\u0430\"<\/code> \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4zUXqnzARFWscb44XGlLBw\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/OwN8IzucSCuJ3LsBmaxL7A\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u0441 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u0427\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f <a href=\"https:\/\/github.com\/wjlow\/blog\/blob\/3c27de716b40660801e68561252883fd0428395e\/Tests.md\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a>.<\/p>\n<h2>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/h2>\n<p>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0438\u043f \u0438 \u043d\u0435\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">opaque type Packed = Any  val predicate: Packed => Boolean =   case str: String => Option(str).exists(_.trim.nonEmpty)   case num: Int    => num > 0   case _           => false<\/code><\/pre>\n<p>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f <code>NonEmpty<\/code> \u0434\u043b\u044f <code>Packed<\/code> \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443:<\/p>\n<pre><code class=\"scala\">import io.github.iltotore.iron.{given, *} import io.github.iltotore.iron.constraint.all.*  final class NonEmpty  given Constraint[Packed, NonEmpty] with    override inline def test(value: Packed): Boolean = predicate(value)    override inline def message: String = \"Should be non empty\"<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>test<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>message<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u043b\u044f <code>Packed<\/code>:<\/p>\n<pre><code class=\"scala\">(null: Packed).refineEither[NonEmpty]     \/\/ Left(Should be non empty) (\"\": Packed).refineEither[NonEmpty]       \/\/ Left(Should be non empty) (\" \": Packed).refineEither[NonEmpty]      \/\/ Left(Should be non empty) (\"   \": Packed).refineEither[NonEmpty]    \/\/ Left(Should be non empty) (0: Packed).refineEither[NonEmpty]        \/\/ Left(Should be non empty) (-42: Packed).refineEither[NonEmpty]      \/\/ Left(Should be non empty) (true: Packed).refineEither[NonEmpty]     \/\/ Left(Should be non empty)  (\"value\": Packed).refineEither[NonEmpty]  \/\/ Right(value) (42: Packed).refineEither[NonEmpty]       \/\/ Right(42)<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/6MsuJONXTHWZcV5h7pLhJQ\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/F7Qf7XD8SGKdfVG3OmffDg\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 &#8212; \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u201c\u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c\u201d.<\/p>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <strong>iron<\/strong> \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0440\u0430\u0432\u043d\u043e\u0441\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0438\u043f\u0430 <code>A &amp; B<\/code> \u2014 \u043a\u043e\u043d\u044c\u044e\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 <code>A<\/code> \u0438 <code>B<\/code>.<\/p>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <strong>refined<\/strong> \u2014 <code>And[A, B]<\/code>.<\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/QdC8NLLJS8OZLygJaN8pMA\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/8rtUUguHSVOrGttlP5J7mQ\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u041f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u043c \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c <a href=\"https:\/\/docs.scala-lang.org\/sips\/42.type.html\">\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f<\/a>, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 Scala 2.13.<\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/hEnqG1UxQkGeBpKX8wt40A\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/JefKM7P2S3GaJfvxNR9yxg\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2<\/a><\/p>\n<h2>\u041d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>refineEither<\/code>, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442, \u0438 \u0441 \u043d\u0438\u043c \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u0435\u0434\u044c \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0430\u0447\u043a\u0430\u043c\u0438. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0446\u0435\u043f\u043e\u0447\u0435\u043a <code>Either<\/code> \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <a href=\"https:\/\/fsharpforfunandprofit.com\/rop\/\">\u00a0<\/a> <a href=\"https:\/\/fsharpforfunandprofit.com\/rop\/\">\u00ab\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u043d\u0443\u044e \u0434\u043e\u0440\u043e\u0433\u0443\u00bb<\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0435, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\/\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438. \u041d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0430\u043f\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u0431\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0437 \u043d\u0438\u0445. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u0438 \u0448\u0430\u0433\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u041d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0438\u0431\u043e \u0432 \u0436\u0435\u043b\u0430\u0435\u043c\u0443\u044e \u0444\u043e\u0440\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043b\u0438\u0431\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d.<\/p>\n<p>\u042d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 <code>ValidatedNec<\/code> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/typelevel.org\/cats\/index.html\">cats<\/a>.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, <strong>iron<\/strong> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/iltotore.github.io\/iron\/docs\/modules\/cats.html\"><strong>iron-cats<\/strong><\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>ValidatedNec[String, A]<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>Either[String, A]<\/code>:<\/p>\n<p>\u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <strong>refined<\/strong> \u0435\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/index.scala-lang.org\/fthomas\/refined\/artifacts\/refined-cats?pre-releases=false\"><strong>refined-cats<\/strong><\/a>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">import cats.data.ValidatedNec import cats.syntax.all.*  import io.github.iltotore.iron.* import io.github.iltotore.iron.cats.* import io.github.iltotore.iron.constraint.all.*  import java.util.UUID  opaque type Name = String :| Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"] opaque type Age  = Int :| Interval.Open[7, 77] opaque type Id   = String :| ValidUUID  final case class Person(name: Name, age: Age, id: Id)  object Person:   def refine(name: String, age: Int, id: String): ValidatedNec[String, Person] =     (       name.refineValidatedNec[Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]],       age.refineValidatedNec[Interval.Open[7, 77]],       id.refineValidatedNec[ValidUUID]     ).mapN(Person.apply)<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>Person.refine<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e: \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b \u043a \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c:<\/p>\n<pre><code class=\"scala\">Person.refine(\"\u0410\u043d\u0434\u0440\u0435\u0439\", 50, UUID.randomUUID().toString) \/\/ Valid(Person(\"\u0410\u043d\u0434\u0440\u0435\u0439\",50,\"fccec68b-cefd-45e8-ae57-b8cdd3fa3cb8\"))<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/typelevel.org\/cats\/typeclasses\/applicative.html\">Applicative<\/a>, \u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u044d\u0442\u0430\u043f\u044b \u201c\u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f\u201d, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <code>NonEmptyChain<\/code>:<\/p>\n<pre><code class=\"scala\">Person.refine(\"Andrew\", 150, \"id\") \/\/ Invalid(Chain( \/\/   \"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\",  \/\/   \"Should be included in (7, 77)\",  \/\/   \"Should be an UUID\" \/\/ ))<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4seolbH9SXeHosgAUNDzFw\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/roViFMw2SsaCWXB1vkMDdA\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 iron \u0438 refined<\/h2>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a <strong>iron<\/strong> \u0438 <strong>refined<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043b\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0434\u0438\u043d\u0430\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041a \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0438\u043d\u0444\u0438\u043a\u0441\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e \u0443 <strong>refined<\/strong>):<\/p>\n<ul>\n<li>\n<p><s>String Refined XXX And YYY<\/s><\/p>\n<\/li>\n<li>\n<p><code>String Refined And[XXX, YYY]<\/code><\/p>\n<\/li>\n<li>\n<p><code>String Refined (XXX And YYY)<\/code><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a <strong>iron<\/strong> \u0438 <strong>refined<\/strong> \u0435\u0441\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/fwbrasil\/bond\">Bond<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.scalactic.org\/\">Scalactic<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0432 <a href=\"https:\/\/iltotore.github.io\/iron\/docs\/modules\/index.html\"><strong>iron<\/strong><\/a><\/p>\n<\/li>\n<li>\n<p>\u0432 <a href=\"https:\/\/github.com\/fthomas\/refined#using-refined\"><strong>refined<\/strong><\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u0413\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u041c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0432\u0438\u0434\u0443 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u043c (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c) \u044d\u0442\u0430\u043f\u043e\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u041f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 QA, \u043f\u043e\u0440\u043e\u0439 \u043f\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0437\u043d\u0430\u043d\u0438\u044f\u043c \u0438 \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434.\u00a0<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u2014 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f, \u043d\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e <em>\u0431\u043e\u043b\u044c\u0448\u0435 \u2014 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435<\/em>, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u0430. \u0418\u043d\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0438\u043b\u0438 \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u043e \u0447\u0435\u0433\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0436\u0435\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u0448\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0438 \u0432\u044b \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a \u0434\u043e\u0440\u043e\u0433\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c.<\/p>\n<p>\u042d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0430\u043a\u043e\u0432\u043e: <em>\u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u043e\u0434\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0430\u0448\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435.<\/em> \u0414\u0430, \u0438 \u043d\u0435 \u0431\u043e\u0439\u0442\u0435\u0441\u044c \u043e\u0441\u043b\u0430\u0431\u043b\u044f\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c!<\/p>\n<p><strong> \u0421\u0441\u044b\u043b\u043a\u0438<\/strong> (\u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435):\u00a0<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/Iltotore\/iron\">iron lib<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fthomas\/refined\">refined lib<\/a>\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0438\u0434\u0435\u043e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=TScwxX62uig\">Better types = fewer tests &#8212; Ra\u00fal Raja<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=Hq2QWbUXKbE&amp;t\">Combining Refined Types with Type Class Derivation in Scala &#8212; Lawrence Carvalho<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=zExb9x3fzKs\">Decorate your types with refined &#8212; Frank Thomas<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=NjqRi-cF3-g\">Defusing the configuration time bomb with PureConfig and Refined &#8212; Leif Wickland<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=Fx8WXcAZWuk\">Enhancing the type system with Refined Types &#8212; Juliano Alves<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=__zuECMFCRc\">How to Build a Functional API &#8212; Julien Truffaut<\/a>  <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=aZsmapo1afQ\">Getting Started with #refined &#8212; DevInsideYou<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=hhXPeuJohM4\">Let The Compiler Help You: How To Make The Most Of Scala\u2019s Typesystem &#8212; Markus Hauck<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/slideslive.com\/38907881\/literal-types-what-they-are-good-for\">Literal types, what they are good for? &#8212; Tamer Abdulradi<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=C3ciegxMAqA\">Refined types for validated configurations \u2013 Viktor L\u00f6vgren<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=IDrGbsupaok\">Refined types in Scala &#8212; Rock the JVM<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=Zq4rkWs_ybA\">Refinement Types &#8212; Tipagem ainda mais forte para Scala &#8212; Marcelo Gomes<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/slideslive.com\/38908776\/security-with-scala-refined-types-and-object-capabilities\">Security with Scala: Refined Types and Object Capabilities &#8212; Will Sargent<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/slideslive.com\/38908213\/strings-are-evil-methods-to-hide-the-use-of-primitive-types\">Strings are Evil: Methods to hide the use of primitive types &#8212; Noel Welsh<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=n1Y2V4zCZdQ\">Why types matter &#8212; Gabriel Volpe<\/a> <\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0442\u0430\u0442\u044c\u0438: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/blog.softwaremill.com\/a-simple-trick-to-improve-type-safety-of-your-scala-code-ba80559ca092\">A simple trick to improve type safety of your Scala code &#8212; Marcin Kubala<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/engineering.contentsquare.com\/2021\/scala-refined-types\/\">How we used Refined to improve type safety and error reporting in Scala &#8212; Bertrand Junqua<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/erikerlandson.github.io\/blog\/2015\/08\/18\/lightweight-non-negative-numerics-for-better-scala-type-signatures\/\">Lightweight Non-Negative Numerics for Better Scala Type Signatures &#8212; Erik Erlandson<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blog.colinbreck.com\/on-eliminating-error-in-distributed-software-systems\">On Eliminating Error in Distributed Software Systems &#8212; Colin Breck<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/lexi-lambda.github.io\/blog\/2019\/11\/05\/parse-don-t-validate\">Parse, don\u2019t validate &#8212; Alexis King<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blog.rockthejvm.com\/refined-types\/\">Refined types in Scala &#8212; Daniel Cioc\u00eerlan<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/medium.com\/swlh\/refined-types-the-good-the-bad-and-the-ugly-ee971e5d9137\">Refined types in Scala: the Good, the Bad and the Ugly &#8212; Manuel Rodr\u00edguez<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/beyondthelines.net\/programming\/refined-types\/\">Refined types, what are they good for? &#8212; Malcolm<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/574080\">Refined \u0442\u0438\u043f\u044b \u0432 Scala &#8212; hakain<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kwark.github.io\/refined-in-practice-bescala\/#1\">Refinement types in practice &#8212; Peter Mortier<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/underscore.io\/blog\/posts\/2017\/03\/07\/refined-data-config-database.html\">Refining your data from configuration to database &#8212; Pere Villega<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tech.ovoenergy.com\/safe-expressive-code-with-refinement-types\/\">Safe, Expressive Code with Refinement Types &#8212; Gordon Rennie<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/wjlow\/blog\/blob\/3c27de716b40660801e68561252883fd0428395e\/Tests.md\">Tests &#8212; can we have too many? &#8212; Jack Low<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blog.michalp.net\/posts\/scala\/refined\/\">Type safety with refined &#8212; Micha\u0142 Pawlik<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/medium.com\/se-notes-by-alexey-novakov\/validate-service-configuration-in-scala-85f661c4b5a6\">Validate Service Configuration in Scala &#8212; Alexey Novakov<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/medium.com\/@Methrat0n\/wtf-is-refined-5008eb233194\">Wtf is Refined? &#8212; Methrat0n<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/kryptonite\/blog\/719488\/\"> https:\/\/habr.com\/ru\/company\/kryptonite\/blog\/719488\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u041a\u0440\u0438\u043f\u0442\u043e\u043d\u0438\u0442\u00bb \u0438 \u043f\u0438\u0448\u0443 \u043d\u0430 Scala. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0430\u0440\u0435 \u043b\u0430\u0439\u0444\u0445\u0430\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043d\u0435 \u0437\u0430\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u043d \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0411\u0443\u0434\u044c \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u0438\u043b\u0438 \u0441\u044b\u0440\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043d\u0435\u0432\u0430\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u0432 Scala \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u0438\u0451\u043c\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <em>\u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0438 \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u0451\u043c \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u043d\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 (\u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0435 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u0430 \u0438\u0434\u0435\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 <a href=\"https:\/\/lexi-lambda.github.io\/blog\/2019\/11\/05\/parse-don-t-validate\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 Scala 3 (\u0432\u0435\u0440\u0441\u0438\u044f 3.2.2) \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 Scala 2 (\u0432\u0435\u0440\u0441\u0438\u044f 2.13.10).<\/p>\n<h2>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u00ab\u0447\u0438\u0441\u0442\u044b\u0435\u00bb \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/h2>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u044d\u0442\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <code>String<\/code> \u2014 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0432 Scala. \u041a\u0430\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442? \u0414\u0430 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u044b \u043c\u0438\u0440\u0430 \u0438 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>\u00ab\u20ac\u2021\u2122\u00b5\u00bb<\/code><\/p>\n<pre><code class=\"scala\">val str: String = \"\u20ac\u2021\u2122\u00b5\"<\/code><\/pre>\n<blockquote>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0444\u0440\u0430\u0437\u0443 <a href=\"https:\/\/github.com\/kenbot\">Ken Scambler<\/a>, \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e <a href=\"https:\/\/www.youtube.com\/watch?v=zExb9x3fzKs&amp;t=52s\">\u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e<\/a>: \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043b\u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043d\u0438\u0433 \u0428\u0435\u043a\u0441\u043f\u0438\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442\u0438\u043f\u0430 <code>String<\/code>?!<\/p>\n<\/blockquote>\n<p>\u0412 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0430\u043a\u0430\u044f \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u0430\u00bb \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0431\u044b \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u043b\u044e\u0434\u0435\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435\u0439 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u0435\u043d \u2014 <code>\u0410\u043b\u0451\u043d\u0430<\/code>, \u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u2014 \u043d\u0435\u0442: <code>\u20ac\u2021\u2122\u00b5<\/code>, <code>12345<\/code>, <code>Alyona<\/code>, <code>\u0410\u043b\u0451\u043d\u043018<\/code>, <code>\u0430\u043b\u0451\u043d\u0430<\/code>.<\/p>\n<p>\u041d\u043e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u0442\u0438\u043f <code>String<\/code>.\u00a0 \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043d\u043e \u0435\u0449\u0451 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0447\u0442\u043e \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0451\u0442\u043a\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439?<\/p>\n<p>\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u0438 \u00ab\u0447\u0438\u0441\u0442\u044b\u0435\u00bb case \u043a\u043b\u0430\u0441\u0441\u044b (\u0438\u043b\u0438 <a href=\"https:\/\/docs.scala-lang.org\/overviews\/core\/value-classes.html\">\u043a\u043b\u0430\u0441\u0441\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/a>) \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u201c\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443\u201d \u043d\u0430\u0434 <code>String<\/code>, \u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u00ab\u043f\u043e\u0434\u043b\u043e\u0436\u0438\u0442\u044c\u00bb \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"scala\">opaque type Name = String val name: Name = \"\u20ac\u2021\u2122\u00b5\" \/\/ val name: Name = \u20ac\u2021\u2122\u00b5<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/j3H5VznPQUOz6ylAQgFMoA\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4ojla7AbTCe4lw8EdHdTMw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2<\/a><\/p>\n<pre><code class=\"scala\">case class Name(value: String) extends AnyVal val name: Name = Name(\"\u20ac\u2021\u2122\u00b5\") \/\/ val name: Name = Name(\u20ac\u2021\u2122\u00b5)<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/CjZpe7ejSwW724prXkQLqg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/69prW6KjRG6MPcL9fJSObw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2<\/a><\/p>\n<p>\u00a0\u00ab\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435\u00bb \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>Name<\/code> \u043f\u0443\u0442\u0451\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>Name<\/code> \u0432 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435:<\/p>\n<pre><code class=\"scala\">import scala.util.matching.Regex  final case class Name private (value: String) extends AnyVal  object Name:   private val pattern: Regex = \"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\".r    def fromString(str: String): Option[Name] =     if pattern.matches(str) then Some(Name(str))     else None<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u0438\u043c\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440:<\/p>\n<pre><code class=\"scala\">val name: Name = Name(\"\u20ac\u2021\u2122\u00b5\") \/\/ \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/code><\/pre>\n<p>\u0410 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e:<\/p>\n<pre><code class=\"scala\">Name.fromString(\"\u20ac\u2021\u2122\u00b5\")     \/\/ None Name.fromString(\"12345\")    \/\/ None Name.fromString(\"Alyona\")   \/\/ None Name.fromString(\"\u0410\u043b\u0451\u043d\u043018\")  \/\/ None Name.fromString(\"\u0430\u043b\u0451\u043d\u0430\")    \/\/ None Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\")    \/\/ Some(Name(\u0410\u043b\u0451\u043d\u0430))<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/Esu8N76RQO6s0kORDsW1Kg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie<\/a><\/p>\n<blockquote>\n<p>\u0412 Scala 2 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043e\u0436\u043d\u043e \u201c\u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c\u201d \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>copy<\/code> (\u0432 Scala 3 \u044d\u0442\u0443 \u043b\u0430\u0437\u0435\u0439\u043a\u0443 \u0443\u0431\u0440\u0430\u043b\u0438):<\/p>\n<p><code>Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\").map(_.copy(\"\u20ac\u2021\u2122\u00b5\")) \/\/ Some(Name(\u20ac\u2021\u2122\u00b5))<\/code><\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 copy \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Scala 2 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a <code>sealed abstract<\/code>, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p><code>sealed abstract case class Name private (value: String) extends AnyVal<\/code><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/JjnQcld3S9iPVoz1isQKqA\">\u041f\u0440\u0438\u043c\u0435\u0440 \u201c\u0432\u0437\u043b\u043e\u043c\u0430\u201d \u0447\u0435\u0440\u0435\u0437 copy \u0432 Scala 2 \u043d\u0430 Scastie<\/a><\/p>\n<\/blockquote>\n<h2>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b<\/h2>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438: <a href=\"https:\/\/github.com\/Iltotore\/iron\"><strong>iron<\/strong><\/a> (\u0434\u043b\u044f Scala 3) \u0438\u00a0 <a href=\"https:\/\/github.com\/fthomas\/refined\"><strong>refined<\/strong><\/a> (\u0434\u043b\u044f Scala 2).<\/p>\n<p>\u0412 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Type_theory\">\u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432<\/a> \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Refinement_type\">\u00ab\u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f\u00bb (refinement type)<\/a> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f, \u0441\u043d\u0430\u0431\u0436\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f + \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \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\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0431\u044b\u043b\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u0424\u0440\u0438\u043c\u0430\u043d\u043e\u043c \u0438 \u041f\u0444\u0435\u043d\u043d\u0438\u043d\u0433\u043e\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 1991 \u0433\u043e\u0434\u0430 <a href=\"https:\/\/www.cs.cmu.edu\/~fp\/papers\/pldi91.pdf\">\u00ab\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f ML\u00bb<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Standard ML.<\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0438\u0434\u0435\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scala \u0431\u044b\u043b\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0430 Flavio W. Brasil \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/fwbrasil\/bond\"><strong>bond<\/strong><\/a>.<\/p>\n<p>\u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/fthomas\/refined\"><strong>refined<\/strong><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u00a0<a href=\"http:\/\/nikita-volkov.github.io\/refined\/\"> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 Haskell\u00a0<\/a> \u041d\u0438\u043a\u0438\u0442\u044b \u0412\u043e\u043b\u043a\u043e\u0432\u0430.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/Iltotore\/iron\"><strong>iron<\/strong><\/a> \u2014 \u044d\u0442\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0438\u0434\u0435\u0438 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432 Scala 3.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 <a href=\"https:\/\/docs.scala-lang.org\/scala3\/book\/first-look-at-types.html\">\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 Scala<\/a>:<\/p>\n<p><code>Long<\/code> (\u043e\u0442 <code>-2^63<\/code> \u0434\u043e <code>2^63 - 1<\/code>) -> <code>Int<\/code> (\u043e\u0442 <code>-2^31<\/code> \u0434\u043e <code>2^31 - 1<\/code>) -> <code>Short<\/code> (\u043e\u0442 <code>-2^15<\/code> \u0434\u043e <code>2^15 - 1<\/code>) -> <code>Byte<\/code> (\u043e\u0442 <code>-2^7<\/code> \u0434\u043e <code>2^7 - 1<\/code>)<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439.<\/p>\n<h2>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 iron \u0438 refined<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>iron<\/strong> (Scala 3) \u0438 <strong>refined<\/strong> (Scala 2).<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>iron<\/strong>:<\/p>\n<pre><code class=\"scala\">import io.github.iltotore.iron.* import io.github.iltotore.iron.constraint.string.*  opaque type Name = String :| Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>refined<\/strong>:<\/p>\n<pre><code class=\"scala\">import eu.timepit.refined.api.Refined import eu.timepit.refined.string.MatchesRegex  type Name = String Refined MatchesRegex[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/pre>\n<p>\u042f\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">val name0: Name = \"\u20ac\u2021\u2122\u00b5\"    \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name1: Name = \"12345\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name2: Name = \"Alyona\"  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name3: Name = \"\u0410\u043b\u0451\u043d\u043018\" \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name4: Name = \"\u0430\u043b\u0451\u043d\u0430\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name5: Name = \"\u0410\u043b\u0451\u043d\u0430\"   \/\/ \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/4zUXqnzARFWscb44XGlLBw\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/OwN8IzucSCuJ3LsBmaxL7A\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 <a href=\"https:\/\/www.scala-lang.org\/api\/3.2.2\/scala\/Option.html\">Option[T]<\/a> (refineOption \u0434\u043b\u044f <strong>iron<\/strong> \/ unapply \u0432 <strong>refined<\/strong>):<\/p>\n<pre><code class=\"scala\">val name0: Option[Name] = \"\u20ac\u2021\u2122\u00b5\".refineOption     \/\/ None val name1: Option[Name] = \"12345\".refineOption    \/\/ None val name2: Option[Name] = \"Alyona\".refineOption   \/\/ None val name3: Option[Name] = \"\u0410\u043b\u0451\u043d\u043018\".refineOption  \/\/ None val name4: Option[Name] = \"\u0430\u043b\u0451\u043d\u0430\".refineOption    \/\/ None val name5: Option[Name] = \"\u0410\u043b\u0451\u043d\u0430\".refineOption    \/\/ Some(\"\u0410\u043b\u0451\u043d\u0430\")<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/w6nxgVi4RHySQg6wGglUlQ\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/e1JE6BfaRBG8cBAEqvshYg\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p>\u0438 \u0432 <a href=\"https:\/\/www.scala-lang.org\/api\/3.2.2\/scala\/util\/Either.html\">Either[String, T]<\/a>, \u0433\u0434\u0435 \u0441\u043b\u0435\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, (refineEither \u0434\u043b\u044f <strong>iron<\/strong> \/ from \u0432 <strong>refined<\/strong>):<\/p>\n<pre><code class=\"scala\">val name0: Either[String, Name] = \"\u20ac\u2021\u2122\u00b5\".refineEither     \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name1: Either[String, Name] = \"12345\".refineEither    \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name2: Either[String, Name] = \"Alyona\".refineEither   \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name3: Either[String, Name] = \"\u0410\u043b\u0451\u043d\u043018\".refineEither  \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name4: Either[String, Name] = \"\u0430\u043b\u0451\u043d\u0430\".refineEither    \/\/ Left(\"Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\") val name5: Either[String, Name] = \"\u0410\u043b\u0451\u043d\u0430\".refineEither    \/\/ Right(\"\u0410\u043b\u0451\u043d\u0430\")<\/code><\/pre>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/cXvITTPiT4a27t8pU9m0fg\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u0434\u043b\u044f <strong>iron<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/scastie.scala-lang.org\/GHkxyKFNRzCttHVgwSiFbw\">\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Scastie \u043d\u0430 Scala 2 \u0434\u043b\u044f <strong>refined<\/strong><\/a><\/p>\n<p><em>\u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/em><\/p>\n<p>\u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0442 <a href=\"https:\/\/iltotore.github.io\/iron\/io\/github\/iltotore\/iron\/constraint.html\">\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 <strong>iron<\/strong><\/a>, \u0430 \u0432\u043e\u0442<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fthomas\/refined#provided-predicates\">\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 refined<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/iltotore.github.io\/iron\/docs\/reference\/refinement.html\">\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 iron<\/a> \u0438 <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fthomas\/refined#more-examples\">\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 refined<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410 \u0432 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/h2>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439\u00bb \u2014 <code>case class Name private (value: String) extends AnyVal<\/code><\/p>\n<\/li>\n<li>\n<p>\u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 <code>opaque type Name = String :| Match[\"[\u0410-\u042f\u0401][\u0430-\u044f\u0451]+\"]<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0432 \u0447\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438? \u0422\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0432 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432?<\/p>\n<p><strong><em>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432<\/em><\/strong><\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <strong>iron<\/strong>\/<strong>refined<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u201c\u0442\u0438\u043f\u044b \u0432\u0440\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443\u0442\u201d.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 case \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"scala\">Name.fromString(\"\u0410\u043b\u0451\u043d\u0430\").get.value \/\/ val res0: String = \u0410\u043b\u0451\u043d\u0430<\/code><\/pre>\n<p>\u041c\u044b \u043e\u043f\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0448\u0438\u0440\u043e\u043a\u043e\u0435\u00bb \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0418 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Name.value<\/code> \u0432 \u043a\u043e\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>String<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0430\u044f \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0436\u0435 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"scala\">val name: Name = \"\u0410\u043b\u0451\u043d\u0430\" \/\/ val name: Name = \u0410\u043b\u0451\u043d\u0430<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043a\u043e\u0434\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; <code>String<\/code>) \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f:<\/p>\n<pre><code class=\"scala\">val name: Name = \"\u0410\u043b\u0451\u043d\u0430\" def printT[T >: String](t: T): Unit = println(t) printT(name) \/\/ \u041f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \"\u0410\u043b\u0451\u043d\u0430\"<\/code><\/pre>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f <a href=\"https:\/\/blog.colinbreck.com\/on-eliminating-error-in-distributed-software-systems\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><strong><em>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/em><\/strong><\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"scala\">val name0: Name = \"\u20ac\u2021\u2122\u00b5\"    \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name1: Name = \"12345\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name2: Name = \"Alyona\"  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name3: Name = \"\u0410\u043b\u0451\u043d\u043018\" \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name4: Name = \"\u0430\u043b\u0451\u043d\u0430\"   \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: Should match [\u0410-\u042f\u0401][\u0430-\u044f\u0451]+  val name5: Name = \"\u0410\u043b\u0451\u043d\u0430\"   \/\/ \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e<\/code><\/pre>\n<p>\u0421\u043a<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-346142","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346142","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=346142"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346142\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=346142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=346142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=346142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}