{"id":304935,"date":"2020-06-06T15:00:36","date_gmt":"2020-06-06T15:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=304935"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-06-06T15:00:36","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=304935","title":{"rendered":"\u0418\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 Rust"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/477330\/\">\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u2014 \u044d\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0431\u0435\u0437\u0443\u043c\u0438\u0435.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y0\/cp\/de\/y0cpdecpzjvzezlr09zet6hvtfw.png\" alt=\"\u041a\u0414\u041f\u0412 \u0432 \u043f\u043e\u0434\u0440\u0430\u0436\u0430\u043d\u0438\u0435 XKCD\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0451\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0432 compile-time \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 Rust. \u041a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043b\u043e\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u0442\u043e\u0433\u0434\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u043d\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u043b \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/468145\/#comment_20652891\">\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/a>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e-\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c Idris.<br \/>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044f \u043d\u0435 \u043c\u043e\u0433 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/Cerberuser\/quasidependent_types\" rel=\"nofollow\">\u043d\u0430 github<\/a>, \u0430 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f: \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, <em>\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435<\/em> \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 Rust, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <em>\u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/em>, \u0438\u043b\u0438 <em>\u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435<\/em> (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f) \u0442\u0438\u043f\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<blockquote><p>\u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 <em>\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e<\/em> \u0442\u0438\u043f\u043e\u0432, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0434\u0430\u043b\u0435\u0435 \u2014 <em>\u0442\u0438\u043f-\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440<\/em>. \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u044d\u0442\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e <strong>\u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c<\/strong>, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430-\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c-\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c.<\/p><\/blockquote>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c &quot;\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e&quot;, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>str<\/code>, \u043c\u044b \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u2014 \u0432\u0435\u0434\u044c \u0442\u0438\u043f <code>str<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u2014 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 UTF-8. \u041d\u043e \u0442\u0430\u043a\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043d\u0430\u043c, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e\u043c \u0442\u0438\u043f\u043e\u0432<\/strong> \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445:  <\/p>\n<ul>\n<li>\u043b\u0438\u0431\u043e \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u043f\u0430\u0436 (trait);<\/li>\n<li>\u043b\u0438\u0431\u043e \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f.<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p>\u0421 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0443 \u043d\u0430\u0441, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043c\u0430\u043d\u0451\u0432\u0440\u0430 \u2014 \u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0434 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0434\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <code>Vec&lt;T&gt;<\/code>, \u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043d\u043e \u043d\u0430\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Idris, \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u044e \u0446\u0435\u043b\u044c \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<p>  <\/p>\n<blockquote><p>\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (\u0432\u0435\u043a\u0442\u043e\u0440\u0430) <code>Vect&lt;N, T&gt;<\/code>, \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u2014 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u0440\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>N<\/code>.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"pervaya-popytka-lozhnyy-sled\">\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430: \u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043b\u0435\u0434<\/h2>\n<p>  <\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0438\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u043e\u0439 \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435: \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u043e\u0432 \u043c\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442.\u043d. &quot;\u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445&quot; \u0442\u0438\u043f\u043e\u0432, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0442\u0438\u043f\u0430\u0436\u0443. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0435\u0433\u043e \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 <code>impl Trait<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0438\u043f\u0430\u0436\u0443, \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043b \u044f, \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct Vect&lt;Item&gt;(Vec&lt;Item&gt;);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043f\u043e\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u2014 \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e \u0438\u0437\u0432\u043d\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>Vect<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u2014 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442). \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">\/\/ \u042d\u0442\u043e\u043c\u0443 \u0442\u0438\u043f\u0430\u0436\u0443 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \/\/ \u043d\u0430\u0448\u0438\u0445 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \/\/ \u0410 \u0438\u043c\u0435\u043d\u043d\u043e: pub trait DependentInner: Sized {     \/\/ \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c &quot;\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u0430\u044f&quot; \u0432\u0435\u0440\u0441\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f     \/\/ \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442;     type Frozen: ?Sized;     \/\/ \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0430\u043c \u0442\u0438\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c     \/\/ \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 &quot;\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u0443\u044e&quot; \u0432\u0435\u0440\u0441\u0438\u044e;     fn freeze(&amp;mut self) -&gt; &amp;mut Self::Frozen;     \/\/ \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0438\u043f \u0438\u0437 &quot;\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0439&quot; \u0432\u0435\u0440\u0441\u0438\u0438.     fn recreate(_: &amp;Self::Frozen) -&gt; Self; }  \/\/ \u0410 \u0435\u0449\u0451 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0434\u0432\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: pub trait DependentInnerOperate: DependentInner {     \/\/ \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0442.\u0435. \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e,     fn transform(mut self, f: impl FnOnce(&amp;mut Self::Frozen)) -&gt; Self {         let mut tmp = Self::recreate(self.freeze());         f(tmp.freeze());         tmp     }     \/\/ \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 in-place.     fn operate(&amp;mut self, f: impl FnOnce(&amp;mut Self::Frozen)) {         f(self.freeze());     } } impl&lt;T: DependentInner&gt; DependentInnerOperate for T {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 \u043e\u043d \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0437, \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u0430, \u0447\u0442\u043e \u043d\u0430\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item: Clone&gt; DependentInner for Vec&lt;Item&gt; {     type Frozen = [Item];     fn freeze(&amp;mut self) -&gt; &amp;mut Self::Frozen {         self.as_mut_slice()     }     fn recreate(frozen: &amp;Self::Frozen) -&gt; Self {         frozen.iter().cloned().collect()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u2014 \u0438 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e, \u043f\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u0435\u0451 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435\u0442 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0443\u0447\u0451\u0442\u0430 \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0438 \u043e\u0431\u0435\u0449\u0430\u043b\u0438, \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0438\u043f\u0430\u0436, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448 <code>Vect&lt;T&gt;<\/code>. \u041e\u043a\u0435\u0439, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait DependentVec&lt;Inner: DependentInnerOperate&gt;: Sized {     \/\/ \u0442\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 } impl&lt;Item: Clone&gt; DependentVec&lt;Vec&lt;Item&gt;&gt; for Vect&lt;Item&gt; {     \/\/ \u0442\u0443\u0442 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412-\u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0445, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0438\u0447 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0447\u0442\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 Rust \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">{     fn local&lt;Item&gt;() -&gt; impl DependentVec&lt;Vec&lt;Item&gt;&gt; {         \/\/ \u0442\u0443\u0442 \u0442\u0435\u043b\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     }     local() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <code>impl Trait<\/code>: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435, \u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u0442\u0438\u043f. \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 <code>Vect&lt;T&gt;<\/code> \u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0442\u0438\u043f\u0430\u0436\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item: Clone&gt; DependentVec&lt;Vec&lt;Item&gt;&gt; for Vect&lt;Item&gt; {     fn try_unify&lt;T: DependentVec&lt;Vec&lt;Item&gt;&gt;&gt;(self, other: T) -&gt; Result&lt;(Self, Self), (Self, T)&gt; {         if self.len() == other.len() {             let other = Self(other.into_inner());             Ok((self, other))         } else {             Err((self, other))         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 <code>try_unify<\/code> \u0432\u0435\u0440\u043d\u0443\u043b\u0430 <code>Ok<\/code>, \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u2014 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0437\u043d\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440! \u2014 \u0447\u0442\u043e \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>Ok<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0443\u044e \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub fn zip_add&lt;Item, T&gt;(first: &amp;T, second: &amp;T) -&gt; T where     Item: AddAssign&lt;Item&gt; + Clone,     T: DependentVec&lt;Vec&lt;Item&gt;&gt; {     first.map_ref(|v1|          second.consume_ref(|v2|              v1.iter_mut()                 .zip(v2.iter())                 .for_each(|(i1, i2)| *i1 += i2.clone())         )     ) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>map_ref<\/code> \u0438 <code>consume_ref<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item: Clone&gt; DependentVec&lt;Vec&lt;Item&gt;&gt; for Vect&lt;Item&gt; {     fn inner(&amp;self) -&gt; &amp;Vec&lt;Item&gt; {         &amp;self.0     }     fn map_ref(&amp;self, f: impl FnOnce(&amp;mut &lt;Vec&lt;Item&gt; as DependentInner&gt;::Frozen)) -&gt; Self {         let mut inner = self.inner().clone();         f(inner.freeze());         Self(inner)     }     fn consume_ref(&amp;self, f: impl FnOnce(&amp;mut &lt;Vec&lt;Item&gt; as DependentInner&gt;::Frozen)) {         f(self.inner().clone().freeze())     } }<\/code><\/pre>\n<p>  <\/p>\n<p>(\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u043b\u0438\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>map<\/code> \u0438 <code>consume<\/code>, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435 <code>self<\/code>)<\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0441\u0442\u0430\u043d\u0443 \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0430\u044f, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432 \u0442\u0438\u043f\u0430\u0436\u0435, \u0438 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u043f\u0440\u0438\u0432\u0435\u0442, \u0421\u0438, \u043f\u0440\u0438\u0432\u0435\u0442, \u0444\u0430\u0439\u043b\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b\u0438\u0441\u044c!<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u043a\u0430\u043a-\u0442\u043e \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u0430\u0447\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0438\u043f\u0430\u0436 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u044f\u043b: \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u0435\u043d\u044f \u0437\u0430\u0432\u043e\u0434\u0438\u0442 \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0443\u0434\u0430, \u043a\u0443\u0434\u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0431\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"poleznaya-chast\">\u041f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e, \u0432\u0441\u0451-\u0442\u0430\u043a\u0438, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438?<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0438\u0434\u0435\u044f &quot;\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430&quot;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043e\u043a, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0442\u0438\u043f\u0430\u0436 Dependent.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044d\u0442\u043e, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0435\u0440\u0432\u0430\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u0442\u0430 \u0441\u0430\u043c\u0430\u044f zip_add, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041e\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439.<\/p>\n<p>  <\/p>\n<h2 id=\"vtoraya-popytka-shagi-realizacii\">\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430: \u0448\u0430\u0433\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u0442\u0440\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 <code>Vect<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d, \u0430 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u043b\u0438\u043d\u0443. \u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0435\u0451 \u043a\u043e\u043f\u0438\u0439, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u043d\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440; \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043c\u0430\u043a\u0440\u043e\u0441 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c) \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 \u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u2014 \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f\u0430\u0436 <code>Nat<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. <\/p>\n<p>  <\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e<\/em> \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u0445 \u0434\u043b\u0438\u043d\u044b \u0440\u0430\u0432\u043d\u044b \u2014 \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u044b. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435 \u044f, \u043f\u0440\u0430\u0432\u0434\u0430, \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_core-tipazh-dependent\"><code>qd_core<\/code>: \u0442\u0438\u043f\u0430\u0436 Dependent<\/h3>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0442\u0438\u043f\u0430\u0436 <code>DependentVect<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u0438, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c &quot;\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e&quot; \u0442\u0438\u043f\u0430. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait Dependent {     type Inner: DependentInnerOperate;     fn from_inner(_: Self::Inner) -&gt; Self     where         Self: Sized;     fn into_inner(self) -&gt; Self::Inner;     fn inner(&amp;self) -&gt; &amp;Self::Inner; } pub trait DependentOperate: Dependent {     \/\/ \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 map, consume \u0438 \u0442.\u0434.     \/\/ \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 from_inner\/into_inner\/inner }\u0410 \u0442\u0435\u043f\u0435\u0440\u044c - \u0441\u0430\u043c `Nat`. \u0417\u0430\u043e\u0434\u043d\u043e \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c API \u043d\u0430\u0448\u0438\u0445 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: - \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u043c\u0435\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 (\u0445\u043e\u0442\u044f \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0443\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u0430\u0441\u044c); - \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0442\u0438\u043f\u0443, \u043d\u0435 \u0438\u043c\u0435\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 - \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e: ```rust pub trait Nat: Sized + NatInner + Clone + Copy {     fn get_usize() -&gt; Option&lt;usize&gt;;     fn as_usize(self) -&gt; usize;     fn from_usize(s: usize) -&gt; Result&lt;Self, crate::NatStoreError&gt;;     fn get() -&gt; Self;     fn try_get() -&gt; Option&lt;Self&gt;; }  #[macro_export] macro_rules! with_n {     ($($inner:tt)*) =&gt; {{         \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a         impl $crate::Nat for N {             fn get_usize() -&gt; Option&lt;usize&gt; {                 HOLDER.read()             }             fn as_usize(self) -&gt; usize {                 \/\/ \u042d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f,                 \/\/ \u0442.\u043a. \u0440\u0430\u0437 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043d, Holder \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d                 HOLDER.read().unwrap();             }             fn from_usize(s: usize) -&gt; Result&lt;Self, $crate::NatStoreError&gt; {                 HOLDER.store(s).map(|_| Self)             }             fn get() -&gt; Self {                 Self::try_get().expect(&quot;Trying to `get` the number which is yet undefined&quot;)             }             fn try_get() -&gt; Option&lt;Self&gt; {                 Self::get_usize().map(|_| Self)             }         }         $($inner)*     }}; }<\/code><\/pre>\n<p>  <\/p>\n<p>impl&lt;T: Dependent&gt; DependentOperate for T {}<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u0412\u0441\u043a\u043e\u0440\u0435, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u0430\u0436\u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u0438\u043a\u0430\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u044f \u043d\u0430\u043c \u0436\u0438\u0437\u043d\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0438\u0445, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0432 \u0442\u0438\u043f `Frozen` \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0442\u0438\u043f\u0430\u0436 `Dependent` \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b: ```rust pub trait Dependent {     type Native;     type Frozen: ?Sized;     fn freeze(&amp;self) -&gt; &amp;Self::Frozen;     fn freeze_mut(&amp;mut self) -&gt; &amp;mut Self::Frozen;     fn into_native(self) -&gt; Self::Native;     fn as_native(&amp;self) -&gt; &amp;Self::Native; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441, \u0430 \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e\u0442 \u0442\u0438\u043f\u0430\u0436? \u042f \u043d\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0443 \u0442\u0430\u043a: \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438, \u0434\u0430, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u043d \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u0435\u043d. \u042f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0436\u0434\u0451\u043c \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u0435\u0442\u043e\u0434\u044b, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u043d\u043e \u043d\u0430 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430\u0436\u0430 \u2014 \u044f\u0432\u043d\u043e \u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <code>Native<\/code> \u0438 <code>Frozen<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, <a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/8995\" rel=\"nofollow\">\u0435\u0441\u043b\u0438 \u0431\u044b Rust \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b<\/a>, \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u0438\u043f.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_nat-dlina-vektora\"><code>qd_nat<\/code>: \u0434\u043b\u0438\u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f\u043c. \u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 (\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f\u0430\u0436:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait Nat: Sized {     fn as_usize(&amp;self) -&gt; usize;     fn from_usize(s: usize) -&gt; Self; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u0430\u0436\u043e\u043c \u0440\u0430\u0432\u043d\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::marker::PhantomData;  #[derive(Copy, Clone, Debug)] pub struct Equiv&lt;T1: Nat, T2: Nat&gt;(PhantomData&lt;(T1, T2)&gt;);  impl&lt;T1: Nat, T2: Nat&gt; Equiv&lt;T1, T2&gt; {     pub fn rev(self) -&gt; Equiv&lt;T2, T1&gt; {         Equiv(PhantomData)     } }  pub trait NatEq: Nat {     fn eq&lt;N: Nat&gt;(this: Self, other: N) -&gt; Option&lt;Equiv&lt;Self, N&gt;&gt; {         if this.as_usize() == other.as_usize() {             Some(Equiv(PhantomData))         } else {             None         }     } } impl&lt;T: Nat&gt; NatEq for T {}<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"qd_vect-sobstvenno-vektor\"><code>qd_vect<\/code>: \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct Vect&lt;T, N: Nat&gt;(Vec&lt;T&gt;, PhantomData&lt;N&gt;); impl&lt;Item: Clone, N: Nat&gt; Dependent for Vect&lt;Item, N&gt; {     type Native = Vec&lt;Item&gt;;     type Frozen = [Item];     fn freeze(&amp;self) -&gt; &amp;Self::Frozen {         self.0.as_slice()     }     fn freeze_mut(&amp;mut self) -&gt; &amp;mut Self::Frozen {         self.0.as_mut_slice()     }     fn into_native(self) -&gt; Self::Native {         self.0     }     fn as_native(&amp;self) -&gt; &amp;Self::Native {         &amp;self.0     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0430 \u043f\u043e\u043b\u044f \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0451 \u0432\u043d\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub fn collect&lt;Item: Clone, N: Nat, I: IntoIterator&lt;Item = Item&gt;&gt;(iter: I) -&gt; (N, Vect&lt;Item, N&gt;) {     let inner: Vec&lt;_&gt; = iter.into_iter().collect();     (N::from_usize(inner.len()), Vect(inner, PhantomData)) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0449\u0451 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u0430\u0436\u043e\u043c <code>Nat<\/code>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0443.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>zip_sum<\/code>, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u0435\u0451 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn zip_sum&lt;T: Clone + Add&lt;T, Output = T&gt;, N: Nat&gt;(     first: Vect&lt;T, N&gt;,     second: Vect&lt;T, N&gt;, ) -&gt; Vect&lt;T, N&gt; {     let mut v1 = first.clone();     let v2 = second.freeze();     v1.freeze_mut().iter_mut()         .zip(v2.iter())         .for_each(|(i1, i2)| *i1 = i1.clone() + i2.clone())     v1 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u0430\u043a \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>Vect<\/code> \u2014 \u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>collect<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c &quot;\u0432 \u043b\u043e\u0431&quot; \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0283]: type annotations needed for `(N, Vect&lt;u32, N&gt;)`   --&gt; ${MODULE}\/tests\/test.rs:7:13    | 7  |     let _ = collect(vec![1u32]);    |         -   ^^^^^^^ cannot infer type for type parameter `N` declared on the function `collect`    |         |    |         consider giving this pattern the explicit type `(N, Vect&lt;u32, N&gt;)`, where the type parameter `N` is specified    |    ::: ${MODULE}\/src\/lib.rs:28:32    | 28 | pub fn collect&lt;Item: Clone, N: Nat, I: IntoIterator&lt;Item = Item&gt;&gt;(iter: I) -&gt; (N, Vect&lt;Item, N&gt;) {    |                                --- required by this bound in `collect`    |    = note: cannot satisfy `_: Nat` help: consider specifying the type arguments in the function call    | 7  |     let _ = collect::&lt;Item, N, I&gt;(vec![1u32]);    |                    ^^^^^^^^^^^^^^<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u0438 \u043a\u0430\u0436\u0443\u0449\u0438\u0439\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u2014 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone)] struct N(usize); impl Nat for N {     fn as_usize(&amp;self) -&gt; usize {         self.0     }     fn from_usize(s: usize) -&gt; Self {         Self(s)     } } let _ = collect::&lt;_, $n, _&gt;($v);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>N<\/code>. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u043d\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0438\u043f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>N::from_usize<\/code> \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_timestamp_marker-de-fakto-privatnyy-tipazh\"><code>qd_timestamp_marker<\/code>: \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0442\u0438\u043f\u0430\u0436<\/h3>\n<p>  <\/p>\n<p>\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0442\u0438\u043f\u0430\u0436 <code>Nat<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u2014 \u043c\u044b \u043e\u043f\u0438\u0448\u0435\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435, \u0430 \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u043e\u0439\u0434\u0451\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u0434\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u2014 \u043d\u0438\u043a\u0430\u043a, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0442\u0440\u044e\u043a, \u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0438\u043f\u0430\u0436\u0430 <code>Nat<\/code> \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[macro_export] macro_rules! n {     () =&gt; {         #[derive(Copy, Clone)]         struct N(usize);         impl $crate::Nat for N {             \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f         }     }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441: \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u0448\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442 \u0440\u0443\u043a\u0438? \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u044f \u0437\u0430\u0434\u0430\u043b \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435 Rust (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e), \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430 \u043d\u0435\u0433\u043e \u0432 \u0447\u0438\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0435\u0433\u043e <a href=\"https:\/\/users.rust-lang.org\/t\/creating-code-to-be-run-through-macro-but-not-directly\/33984\/5\" rel=\"nofollow\">\u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043e\u0442\u0432\u0435\u0442<\/a>, \u0441\u0432\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u0434\u0435\u0435: \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c (\u0438\u043b\u0438 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c, \u043d\u043e \u0438 \u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c) \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430\u0436\u0430, \u0442\u0430\u043a \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0435\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u0430\u0436 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u2014 \u0435\u0433\u043e \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436, \u043f\u0438\u0448\u0435\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"rust\">extern crate proc_macro;  use proc_macro::TokenStream; use quote::{format_ident, quote, ToTokens}; use std::time::{SystemTime, UNIX_EPOCH}; use syn::*;  #[proc_macro_attribute] pub fn timestamp_marker(attr: TokenStream, input: TokenStream) -&gt; TokenStream {     \/\/ \u041c\u0430\u043a\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0441\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c     let mut input = parse_macro_input!(input as ItemMod);      \/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440     let replaced = parse_macro_input!(attr as Ident);     \/\/ \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0435\u0433\u043e \u0436\u0435, \u043d\u043e \u0441 \u043f\u0440\u0438\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u043c timestamp-\u043e\u043c     let replacement = format_ident!(         &quot;{}{}&quot;,         replaced,         SystemTime::now()             .duration_since(UNIX_EPOCH)             .expect(&quot;Time went backwards&quot;)             .as_millis()     );      \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0443\u043b\u044f     let content = input         .content         .as_mut()         \/\/ \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442 (\u0442.\u0435. \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435) - \u043f\u0430\u043d\u0438\u043a\u0443\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438         .expect(&quot;Only the inline modules can be labeled with timestamp&quot;);     \/\/ \u0418 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043c\u0435\u043d\u044b (\u0441\u043c. \u043d\u0438\u0436\u0435)     content.1.iter_mut().for_each(|item| {         *item = parse2(update(item.to_token_stream(), &amp;replaced, &amp;replacement)).unwrap()     });      let output = quote! { #input };     output.into() }  fn update(item: proc_macro2::TokenStream, from: &amp;Ident, to: &amp;Ident) -&gt; proc_macro2::TokenStream {     use proc_macro2::*;     item.into_iter()         \/\/ \u041d\u0430\u0441 \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:         \/\/ \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u0430 (\u0442.\u0435. \u043d\u0435\u0447\u0442\u043e \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445),         \/\/ \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.         .map(|tok| match tok {             TokenTree::Group(group) =&gt; {                 \/\/ \u0413\u0440\u0443\u043f\u043f\u0443 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e,                 let mut new_group = Group::new(group.delimiter(), update(group.stream(), from, to));                 \/\/ \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435                 new_group.set_span(group.span());                 TokenTree::Group(new_group)             }             TokenTree::Ident(ident) if &amp;ident == from =&gt; {                 \/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c.                 let mut to = to.clone();                 \/\/ \u0418, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435.                 to.set_span(ident.span());                 TokenTree::Ident(to)             }             \/\/ \u0412\u0441\u0451 \u043f\u0440\u043e\u0447\u0435\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c.             tok =&gt; tok,         })         .collect() }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h3 id=\"qd_nat-kvazizavisimye-chisla\"><code>qd_nat<\/code>: \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0447\u0438\u0441\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0442\u0438\u043f\u0430\u0436 <code>Nat<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043a\u043e\u0434\u0435, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c. \u041e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[timestamp_marker(NatInner)] pub mod nat {     pub unsafe trait NatInner {}     pub trait Nat: Sized + NatInner + Clone + Copy {         fn as_usize(&amp;self) -&gt; usize;         fn from_usize(s: usize) -&gt; Self;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u0430\u0436 <code>Nat<\/code> \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e, \u0438 \u043c\u044b \u044d\u0442\u0438\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f. \u0410 \u0432\u043e\u0442 \u0442\u0438\u043f\u0430\u0436 <code>NatInner<\/code> \u2014 \u0443\u0436\u0435 \u043d\u0435\u0442, \u0438, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430\u0436\u0430 <code>Nat<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u043f\u043e\u0434\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b. \u0422\u0430\u043a\u0436\u0435 \u0442\u0438\u043f\u0430\u0436 <code>NatInner<\/code> \u0441\u0434\u0435\u043b\u0430\u043d &quot;\u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c&quot; \u2014 \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043f\u043e\u0437\u0436\u0435 \u0438\u043c\u0435\u043b\u0438 \u043f\u0440\u0430\u0432\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u0430\u0436\u0430 <code>Nat<\/code> \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0443\u0445\u0438\u0442\u0440\u0438\u0442\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0430\u0448\u0443 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0443 \u0441 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0442\u0438\u043f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c <code>N<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">macro_rules! with_n {     ($($inner:tt)*) =&gt; {{         #[derive(Copy, Clone, Debug)]         struct N;         unsafe impl $crate::NatInner for N {}         impl $crate::Nat for N {             \/\/ \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f         }         $($inner)*     }}; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043f\u0440\u0430\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u0417\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u043e\u043c \u0438, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0442\u043e\u044f\u0442\u044c \u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u2014 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u043d\u0451\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0442\u0438\u043f\u0430 <code>N<\/code>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>with_n<\/code> \u043f\u043e\u0434\u0440\u044f\u0434 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0443\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u0430 \u0442\u0438\u043f <code>N<\/code> \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0440\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0412 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u2014 \u043f\u043e \u0441\u0443\u0442\u0438, write-only \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f <code>AtomicUsize<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 <a href=\"https:\/\/users.rust-lang.org\/t\/write-once-static-option\/35033\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use thiserror::Error;  #[derive(Debug, Error)] pub enum NatStoreError {     \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 `store()` \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e     #[error(&quot;Attempted to concurrently create multiple instances of N: Nat&quot;)]     Concurrent,     \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u0442\u0435\u0440\u0435\u0442\u044c \u0443\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     #[error(&quot;Attempted to override already stored value {0} with {1}&quot;)]     AlreadyStored(usize, usize), }  pub struct NatHolder { \/* skipped *\/ } impl NatHolder {     pub const fn new() -&gt; Self {         \/\/ skipped     }     pub fn store(&amp;self, value: usize) -&gt; Result&lt;(), NatStoreError&gt; {         \/\/ skipped     }     pub fn read(&amp;self) -&gt; Option&lt;usize&gt; {         \/\/ skipped     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u2014 \u0441\u0430\u043c <code>Nat<\/code>. \u0417\u0430\u043e\u0434\u043d\u043e \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c API \u043d\u0430\u0448\u0438\u0445 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u043c\u0435\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 (\u0445\u043e\u0442\u044f \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0443\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u0430\u0441\u044c);<\/li>\n<li>\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0442\u0438\u043f\u0443, \u043d\u0435 \u0438\u043c\u0435\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait Nat: Sized + NatInner + Clone + Copy {     fn get_usize() -&gt; Option&lt;usize&gt;;     fn as_usize(self) -&gt; usize;     fn from_usize(s: usize) -&gt; Result&lt;Self, crate::NatStoreError&gt;;     fn get() -&gt; Self;     fn try_get() -&gt; Option&lt;Self&gt;; }  #[macro_export] macro_rules! with_n {     ($($inner:tt)*) =&gt; {{         \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a         impl $crate::Nat for N {             fn get_usize() -&gt; Option&lt;usize&gt; {                 HOLDER.read()             }             fn as_usize(self) -&gt; usize {                 \/\/ \u042d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f,                 \/\/ \u0442.\u043a. \u0440\u0430\u0437 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043d, Holder \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d                 HOLDER.read().unwrap();             }             fn from_usize(s: usize) -&gt; Result&lt;Self, $crate::NatStoreError&gt; {                 HOLDER.store(s).map(|_| Self)             }             fn get() -&gt; Self {                 Self::try_get().expect(&quot;Trying to `get` the number which is yet undefined&quot;)             }             fn try_get() -&gt; Option&lt;Self&gt; {                 Self::get_usize().map(|_| Self)             }         }         $($inner)*     }}; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0435\u0449\u0451, \u0437\u0430\u0431\u0435\u0433\u0430\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0435\u0440\u0451\u0434, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e <code>Result::unwrap<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub fn expect_nat&lt;N: Nat&gt;(s: usize) -&gt; N {     N::from_usize(s).unwrap_or_else(|err| panic!(format!(&quot;{}&quot;, err))) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>Equiv<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e API:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N1: Nat, N2: Nat&gt; Equiv&lt;N1, N2&gt; {     pub fn check() -&gt; Option&lt;Self&gt; {         N1::get_usize().and_then(|n1| {             N2::get_usize().and_then(|n2| {                 if n1 == n2 {                     Some(Self(PhantomData))                 } else {                     None                 }             })         })     }     pub fn try_prove_for(_: N1, _: N2) -&gt; Option&lt;Self&gt; {         Self::try_create()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u0441\u0442. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn accepts_pair&lt;N1: Nat, N2: Nat&gt;(n1: N1, n2: N2, _proof: Equiv&lt;N1, N2&gt;) {     \/\/ \u044d\u0442\u043e\u0442 assertion \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f     assert_eq!(n1.as_usize(), n2.as_usize()); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430 (\u0442\u043e\u0447\u043d\u0435\u0435, \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0442\u0438\u043f\u0430\u0436\u043e\u043c <code>Nat<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u044b. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn checked() {     use qd_nat::with_n;      let n = with_n!(N::from_usize(1).unwrap());     let n1 = with_n!(N::from_usize(1).unwrap());     let n2 = with_n!(N::from_usize(2).unwrap());      match Equiv::try_prove_for(n, n1) {         Some(proof) =&gt; accepts_pair(n, n1, proof),         None =&gt; panic!(&quot;1 != 1, WTF?&quot;),     };     match Equiv::try_prove_for(n1, n2) {         None =&gt; {}         Some(_) =&gt; panic!(&quot;1 == 2, WTF?&quot;),     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u0445\u043e\u0436\u0435, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u041f\u043e\u0440\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c!<\/p>\n<p>  <\/p>\n<h3 id=\"qd_vect-nakonec-to-sozdayom\"><code>qd_vect<\/code>: \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 <code>with_n<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[macro_export] macro_rules! vect {     ($data:expr) =&gt; {         ::qd_nat::with_n! {             let v = $data;             $crate::collect::&lt;_, N, _&gt;(v)         }     }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0431\u043e \u0438 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0432\u0435\u0436\u0438\u0439 \u0442\u0438\u043f <code>N<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 &quot;\u0442\u0443\u0440\u0431\u043e\u0440\u044b\u0431\u0443&quot; \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>collect<\/code>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0435\u0439 \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0441\u043a\u043e\u043c\u044b\u0439 <code>Vect&lt;N, T&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0438\u043f\u0430\u0436\u0430 <code>Nat<\/code> \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>collect<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub fn collect&lt;Item, N: Nat, I: IntoIterator&lt;Item = Item&gt;&gt;(     iter: I, ) -&gt; (N, Vect&lt;Item, N&gt;) {     let inner: Vec&lt;_&gt; = iter.into_iter().collect();     \/\/ Nat::from_usize \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Result -     \/\/ \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u043c \u0435\u0433\u043e     (expect_nat(inner.len()), Vect(inner, PhantomData)) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u043e \u043d\u0430\u0448\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>zip_sum<\/code>. \u041e\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430, \u0441 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>N<\/code>; \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443, \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0432\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u2014 \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432\u043f\u0440\u0430\u0432\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c. <\/p>\n<p>  <\/p>\n<p>\u0423\u0441\u043b\u043e\u0432\u0438\u0435, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 <code>Equiv&lt;N1, N2&gt;<\/code>. \u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item, N: Nat&gt; Vect&lt;Item, N&gt; {     pub fn retag&lt;New: Nat&gt;(self, _proof: Equiv&lt;N, New&gt;) -&gt; Vect&lt;Item, New&gt; {         Vect(self.0, PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn summing() {     let (_, v1) = vect!(vec![1]);     let (_, v2) = vect!(vec![1]);      assert_eq!(         \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 Equiv, \u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c...         Equiv::check()             \/\/ ...\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u0432 retag, \u043c\u0435\u043d\u044f\u044f \u0442\u0438\u043f v2...             .map(|proof| v2.retag(proof))             \/\/ ...\u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 - \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u043e\u0431\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430...             .map(|v2| zip_sum(v1, v2))             \/\/ ...\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439...             .map(Vect::into_native),         \/\/ ...\u0438 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.         Some(vec![2])     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u043d\u0438 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u0438\u0437 <code>collect<\/code>, \u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b. \u0412 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 Rust \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0430\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438, \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<p>\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u043d\u0430\u043c \u043d\u0435 \u0434\u0430\u0434\u0443\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn summing_mismatch() {     let (_, v1) = vect!(vec![]);     let (_, v2) = vect!(vec![1]);      assert_eq!(         Equiv::check()             .map(|proof| v2.retag(proof))             .map(|v2| zip_sum(v1, v2))             .map(Vect::into_native),         None     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430-\u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432 \u0437\u0430\u043f\u0430\u0441\u0435 \u0435\u0449\u0451 \u043f\u0430\u0440\u0430 \u0438\u0434\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 (\u0432 \u043d\u0430\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u2014 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u0443\u044e, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u043d\u0430 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0441\u0435\u043b \u0438 \u0441\u043b\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438. \u041f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 \u0447\u0438\u0441\u0435\u043b, \u0432\u044b\u043a\u0438\u043d\u0443\u0432 \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438 \u0441\u043b\u043e\u0436\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn runtime_size() {     macro_rules! parse_i64_discarding {         ($string:literal) =&gt; {             vect! {{                 use std::str::FromStr;                 let string: &amp;str = &amp;*$string;                 \/\/ vect! \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 - \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c                 string.split(&quot;,&quot;).map(i64::from_str).filter_map(Result::ok)             }}         };     }      let (_, v1) = parse_i64_discarding!(&quot;1,2,3,four,5&quot;);     let (_, v2) = parse_i64_discarding!(&quot;1,two,3,4,5&quot;);     assert_eq!(         Equiv::check().map(|proof| zip_sum(v1.retag(proof), v2).into_native()),         Some(vec![2, 5, 7, 10])     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u043a \u043d\u0430\u0448\u0438\u043c \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_nat-tip-chislo-menshe-n\"><code>qd_nat<\/code>: \u0442\u0438\u043f &quot;\u0447\u0438\u0441\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 N&quot;<\/h3>\n<p>  <\/p>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043d\u0430\u0448 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f: \u043f\u0440\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <code>Fin n<\/code>, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e &quot;\u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u2014 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0435 \u2014 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435\u0435, \u0447\u0435\u043c <code>n<\/code>&quot; (\u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0432 Rust. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone, Debug)] pub struct Fin&lt;N: Nat&gt;(usize, PhantomData&lt;N&gt;);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043b\u044e\u0431\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430: \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 (\u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439) \u0438 \u0438\u0437 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u0430\u0434\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N: Nat&gt; Fin&lt;N&gt; {     pub fn from_usize(s: usize) -&gt; Option&lt;Self&gt; {         if s &lt; N::get_usize()? {             Some(Self(s, PhantomData))         } else {             None         }     }     pub fn as_usize(self) -&gt; usize {         self.0     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u2014 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0421\u0430\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442\u0438\u043f\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct IterUntil&lt;N: Nat&gt;(usize, PhantomData&lt;N&gt;); impl&lt;N: Nat&gt; Iterator for IterUntil&lt;N&gt; {     type Item = Fin&lt;N&gt;;     fn next(&amp;mut self) -&gt; Option&lt;Fin&lt;N&gt;&gt; {         if self.0 &lt; N::get_usize().unwrap() {             let ret = Some(Fin(self.0, PhantomData));             self.0 += 1;             ret         } else {             None         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441 \u0435\u0449\u0451 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u2014 \u043e\u0448\u0438\u0431\u043a\u0430, \u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u0430\u043d\u0438\u043a\u0435. \u041b\u0438\u0447\u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043d\u043e, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>None<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0432 \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 <code>N::get_usize().and_then()<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435: \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0438\u043d\u0430\u0447\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N: Nat&gt; Iterator for IterUntil&lt;N&gt; {     type Item = Fin&lt;N&gt;;     fn next(&amp;mut self) -&gt; Option&lt;Fin&lt;N&gt;&gt; {         let ret = if self.0 &lt; N::get_usize().unwrap() {             Some(Fin(self.0, PhantomData))         } else {             None         };         self.0 += 1;         ret     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f fused-\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c (\u0432\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043d\u0430\u0448\u0451\u043b) \u2014 \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>None<\/code> \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u044b\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u043e\u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u0442\u0435\u0441\u0442\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn overflow() {     let n = with_n! { N::from_usize(usize::MAX).unwrap() };     \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e     let mut iter = n.iter_until_this().skip(usize::MAX - 1);     \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439...     assert_eq!(iter.next().map(Fin::as_usize), Some(usize::MAX - 1));     \/\/ ...\u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430 \u043d\u0438\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442...     assert_eq!(iter.next().map(Fin::as_usize), None);     \/\/ ...\u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 next() \u0432\u0435\u0440\u043d\u0451\u0442 Some(0)     assert_eq!(iter.next().map(Fin::as_usize), None); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 &quot;\u043a\u0430\u043a \u0435\u0441\u0442\u044c&quot; \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u043b \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442 \u0438 \u0443\u0431\u0435\u0434\u0438\u043b\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438\u0447\u0438\u043d\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>skip<\/code>, \u0430 \u0432\u0435\u0440\u043d\u0435\u0435, \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>nth<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>skip<\/code>: \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>next<\/code>, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044f\u0432\u043d\u043e \u043d\u0435\u0431\u044b\u0441\u0442\u0440\u044b\u0439.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, <code>Range<\/code>. \u0421\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0443, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N: Nat&gt; Iterator for IterUntil&lt;N&gt; {     \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a     #[inline]     fn nth(&amp;mut self, n: usize) -&gt; Option&lt;Fin&lt;N&gt;&gt; {         let max_value = N::get_usize().unwrap();         if let Some(plus_n) = self.0.checked_add(n) {             if plus_n &lt; max_value {                 self.0 = plus_n + 1;                 return Some(Fin(plus_n, PhantomData));             }         }         self.0 = max_value;         None     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442 \u0441\u0442\u0430\u043b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u043d\u0443 \u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 <code>next<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0438\u043f\u0430\u0436-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0438\u043f\u0430\u0436\u0430 <code>Nat<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait NatIterUntil: Nat {     fn iter_until() -&gt; IterUntil&lt;Self&gt; {         IterUntil(0, PhantomData)     }     fn iter_until_this(self) -&gt; IterUntil&lt;Self&gt; {         Self::iter_until()     } } impl&lt;N: Nat&gt; NatIterUntil for N {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u044d\u0442\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_vect-garantirovanno-korrektnyy-indeks\"><code>qd_vect<\/code>: \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, <code>Fin&lt;N&gt;<\/code> \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 <code>Vect&lt;N, T&gt;<\/code>. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item, N: Nat&gt; Vect&lt;Item, N&gt; {     pub fn find_index(&amp;self, mut predicate: impl FnMut(&amp;Item) -&gt; bool) -&gt; Option&lt;Fin&lt;N&gt;&gt; {         N::iter_until().find(|&amp;n| predicate(&amp;self[n]))     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u043b\u0435\u0441\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432\u043f\u0440\u0430\u0432\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 unsafe-\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f\u043c, \u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c <code>Fin<\/code> \u0438 \u0441\u0430\u043c\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item, N: Nat&gt; Index&lt;Fin&lt;N&gt;&gt; for Vect&lt;Item, N&gt; {     type Output = Item;     fn index(&amp;self, index: Fin&lt;N&gt;) -&gt; &amp;Item {         \/\/ \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: Fin&lt;N&gt;::as_usize(fin) &lt; N::get_usize() == self.0.len()          unsafe { self.0.get_unchecked(index.as_usize()) }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u2014 \u0446\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <code>Fin<\/code>, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u0430, \u043d\u043e \u0441\u0430\u043c \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0437\u0430\u043d\u044f\u0442\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u0418 \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_nat-fiksirovannye-chisla\"><code>qd_nat<\/code>: \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0447\u0451\u0440\u043d\u0443\u044e \u043c\u0430\u0433\u0438\u044e \u0442\u0438\u043f\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <a href=\"https:\/\/crates.io\/crates\/typenum\" rel=\"nofollow\"><code>typenum<\/code><\/a>. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e \u043d\u0451\u043c \u0438 \u0437\u0434\u0435\u0441\u044c? \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u0442\u0438\u043f\u0430\u0436 <code>Unsigned<\/code> \u0438\u0437 <code>typenum<\/code> \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u2014 \u0441 \u0442\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u043e\u0439, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0418, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0442\u0438\u043f\u0430\u0436 <code>Nat<\/code> \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b \u0438\u0437 <code>typenum<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use typenum::Unsigned;  unsafe impl&lt;T: Unsigned&gt; NatInner for T {} impl&lt;T: Unsigned + Default + Copy + Clone&gt; Nat for T {     fn get_usize() -&gt; Option&lt;usize&gt; {         Some(Self::USIZE)     }     fn as_usize(self) -&gt; usize {         Self::USIZE     }     fn from_usize(s: usize) -&gt; Result&lt;Self, NatStoreError&gt; {         if s == Self::USIZE {             Ok(Self::default())         } else {             Err(NatStoreError::AlreadyStored(Self::USIZE, s))         }     }     fn get() -&gt; Self {         Self::default()     }     fn try_get() -&gt; Option&lt;Self&gt; {         Some(Self::default())     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u043e-\u0442\u043e\u043d\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u2014 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0422\u0443\u0442 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e <a href=\"https:\/\/docs.rs\/typenum\/1.12.0\/typenum\/marker_traits\/trait.Unsigned.html\" rel=\"nofollow\"><code>\u0442\u0438\u043f\u0430\u0436 Unsigned<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0438\u043f\u0430\u0436\u0430 <code>Default<\/code><\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_vect-generic-array-na-novyy-lad\"><code>qd_vect<\/code>: generic array \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u043b\u0430\u0434<\/h3>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u044b\u0448\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <a href=\"https:\/\/crates.io\/crates\/generic-array\" rel=\"nofollow\"><code>generic_array<\/code><\/a>, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn fixed_size() {     use qd_vect::collect;     use typenum::consts::*;     let (_, v) = collect::&lt;_, U2, _&gt;(vec![1u32, 2]);     assert_eq!(v.into_native(), vec![1u32, 2]); }  #[test] #[should_panic(expected = &quot;Attempted to override already stored value 2 with 1&quot;)] fn fixed_size_mismatch() {     use qd_vect::collect;     use typenum::consts::*;     let _ = collect::&lt;_, U2, _&gt;(&amp;[1]); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451.<\/p>\n<p>  <\/p>\n<h3 id=\"qa_nat-operacii-nad-chislami\"><code>qa_nat<\/code>: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0447\u0438\u0441\u043b\u0430\u043c\u0438<\/h3>\n<p>  <\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u043a \u043d\u0430\u0448\u0438\u043c \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u0443\u043c\u0435\u043b\u0438 \u0441 \u043d\u0438\u043c\u0438 \u0434\u0435\u043b\u0430\u0442\u044c, \u2014 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u0430 <code>Equiv<\/code>). \u042d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u2014 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u2014 \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 (\u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438) \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u044f\u0441\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b (\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f). \u0417\u0430\u0432\u0435\u0434\u0451\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0441\u0443\u043c\u043c\u044b \u0434\u0432\u0443\u0445 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone)] pub struct Add&lt;N1: Nat, N2: Nat&gt;(PhantomData&lt;(N1, N2)&gt;);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u043e\u043d \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N1: Nat, N2: Nat&gt; Nat for Add&lt;N1, N2&gt; {     fn get_usize() -&gt; Option&lt;usize&gt; {         N1::get_usize().and_then(|n1| N2::get_usize().map(|n2| n1 + n2))     }     fn as_usize(self) -&gt; usize {         Self::get_usize().expect(&quot;`Add` was created and queried before its components were set&quot;)     }     fn from_usize(s: usize) -&gt; Result&lt;Self, NatStoreError&gt; {         if let Some(inner) = Self::get_usize() {             if inner == s {                 Ok(Self(PhantomData))             } else {                 Err(NatStoreError::AlreadyStored(inner, s))             }         } else {             todo!(&quot;Needs fix to NatStoreError&quot;)         }     }     fn get() -&gt; Self {         Self::try_get().expect(&quot;Trying to create `Add` instance which is yet undefined&quot;)     }     fn try_get() -&gt; Option&lt;Self&gt; {         Self::get_usize().map(|_| Self(PhantomData))     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u2014 <code>todo<\/code> \u0432 <code>from_usize<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e &quot;\u043f\u0440\u043e\u0441\u0442\u044b\u0435&quot; \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443, \u0430 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 NatStoreError:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Debug, Error)] pub enum NatStoreError {     \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a     #[error(&quot;Attempted to create composite number {0} before its components&quot;)]     UnknownCompositeParts(&amp;'static str), }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c <code>from_usize<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn from_usize(s: usize) -&gt; Result&lt;Self, NatStoreError&gt; {     if let Some(inner) = Self::get_usize() {         \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a     } else {         Err(NatStoreError::UnknownCompositeParts(std::any::type_name::&lt;Self&gt;()))     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>Add<\/code> \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0430\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] #[should_panic] fn add_unknown() {     with_n! {         let _: Add&lt;N, N&gt; = Add::from_usize(0).unwrap();     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043c\u044b, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0435\u0442\u043e\u0434 <code>std::any::type_name<\/code> \u043d\u0435 \u0434\u0430\u0451\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u043c\u044b \u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e <code>should_panic<\/code>, \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_vect-konkatenaciya\"><code>qd_vect<\/code>: \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e \u043a\u0432\u0430\u0437\u0438\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u043a <code>Vect<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item, N: Nat&gt; Vect&lt;Item, N&gt; {     fn concat&lt;N2: Nat&gt;(mut self, vect: Vect&lt;Item, N2&gt;) -&gt; Vect&lt;Item, Add&lt;N, N2&gt;&gt; {         self.0.extend(vect.into_native());         Vect(self.0, PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u2014 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Item, N: Nat&gt; Vect&lt;Item, N&gt; {     pub fn push(mut self, item: Item) -&gt; Vect&lt;Item, Add&lt;N, typenum::consts::U1&gt;&gt; {         self.0.extend(std::iter::once(item));         Vect(self.0, PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e <code>push<\/code> \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0430 \u0432\u043e\u0442 \u0441 <code>concat<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043a\u043e\u0435-\u0447\u0442\u043e.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0443\u0447\u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_core-staticheski-vyvodimye-fakty\"><code>qd_core<\/code>: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u043a\u0442\u044b<\/h3>\n<p>  <\/p>\n<p>\u041d\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c. \u0410 \u0445\u043e\u0442\u0438\u043c \u043c\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 (\u043a\u0430\u043a <code>Equiv<\/code>), \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0447\u0438\u0441\u043b\u0430 \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435: \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>Equiv&lt;N, N&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0435\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e <code>N1 = N2<\/code>, \u0442.\u0435. \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>Equiv&lt;N1, N2&gt;<\/code>, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>Equiv&lt;N2, N1&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0434\u0432\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0438\u043f\u0430\u0436\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait StaticallyProvable {     \/\/ \u041d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, - \u043e\u043d\u043e \u0443\u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0442\u0438\u043f\u0430\u0445.     fn proof() -&gt; Self; }  pub trait Deducible&lt;Reason&gt; {     \/\/ \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0436\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0430\u043a\u0442\u0430.     fn deduce(_: Reason) -&gt; Self; }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"qd_nat-fiksiruem-svoystva-chisel-i-operaciy\"><code>qd_nat<\/code>: \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0438\u0441\u0435\u043b \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430\u0436\u0435\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0438\u0441\u0435\u043b. \u0422\u0430\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N: Nat&gt; Equiv&lt;N, N&gt; {     pub fn refl() -&gt; Self {         Self(PhantomData)     } } impl&lt;N: Nat&gt; StaticallyProvable for Equiv&lt;N, N&gt; {     fn proof() -&gt; Self {         Self::refl()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 <code>refl<\/code> \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438 \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043e \u0438\u0437 Idris \u2014 \u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u043b\u0451\u0433\u043a\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0432\u044b\u0435\u0445\u0430\u0442\u044c \u043d\u0430 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f - \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0434\u0432\u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 type Transit&lt;N1, N2, N3&gt; = (Equiv&lt;N1, N2&gt;, Equiv&lt;N2, N3&gt;);  impl&lt;N1: Nat, N2: Nat, N3: Nat&gt; Deducible&lt;Transit&lt;N1, N2, N3&gt;&gt; for Equiv&lt;N1, N3&gt; {     fn deduce(_: Transit&lt;N1, N2, N3&gt;) -&gt; Self {         Self(PhantomData)     } }  impl&lt;N1: Nat, N2: Nat&gt; Deducible&lt;Equiv&lt;N1, N2&gt;&gt; for Equiv&lt;N2, N1&gt; {     fn deduce(_: Equiv&lt;N1, N2&gt;) -&gt; Self {         Self(PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N1: Nat, N2: Nat&gt; StaticallyProvable for Equiv&lt;Add&lt;N1, N2&gt;, Add&lt;N2, N1&gt;&gt; {     fn proof() -&gt; Self {         Self(PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0119]: conflicting implementations of trait `qd_core::StaticallyProvable` for type `eq::Equiv&lt;ops::Add&lt;_, _&gt;, ops::Add&lt;_, _&gt;&gt;`:   --&gt; qd_nat\/src\/ops.rs:42:1    | 42 | impl&lt;N1: Nat, N2: Nat&gt; StaticallyProvable for Equiv&lt;Add&lt;N1, N2&gt;, Add&lt;N2, N1&gt;&gt; {    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `eq::Equiv&lt;ops::Add&lt;_, _&gt;, ops::Add&lt;_, _&gt;&gt;`    |    ::: qd_nat\/src\/eq.rs:40:1    | 40 | impl&lt;N: Nat&gt; StaticallyProvable for Equiv&lt;N, N&gt; {    | ----------------------------------------------- first implementation here<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 <code>N1<\/code> \u0438 <code>N2<\/code> \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u0432\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430\u0436\u0430. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u0435\u0442\u043e\u0434 <code>proof<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430: Rust \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u0435 \u0437\u0434\u0435\u0441\u044c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439. \u0412\u0430\u0440\u0438\u0430\u043d\u0442, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f\u0430\u0436 <code>Primitive<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f &quot;\u043e\u0431\u044b\u0447\u043d\u044b\u0445&quot; \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441;<\/li>\n<li>\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>&lt;N: Primitive&gt; StaticallyProvable for Equiv&lt;N, N&gt;<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a <code>Add<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>Primitive<\/code>, \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a, <code>Equiv&lt;Add&lt;N1, N2&gt;, Add&lt;N1, N2&gt;&gt;<\/code> \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0434\u043e\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u044b \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u2014 \u043e\u043d\u0430 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u0440\u0435\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0438 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442 \u043d\u0430\u0441 \u0441\u043d\u043e\u0432\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 <code>qd_core<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_core-dokazatelstva-po-pravilam\"><code>qd_core<\/code>: \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c<\/h3>\n<p>  <\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430\u0436\u0430 <code>StaticallyProvable<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait StaticallyProvable&lt;Rule&gt; where Self: Sized {     fn proof() -&gt; Self;     fn prove_by_rule(_: Rule) -&gt; Self {         Self::proof()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430\u0436\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u043f, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u043a\u0430\u043a\u043e\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438. \u041c\u0435\u0442\u043e\u0434 <code>prove_by_rule<\/code>, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438, \u043a\u0430\u043a\u043e\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u2014 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u043e\u0434\u043d\u043e \u043e\u0431\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f <code>Deducible<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;Rule, T: StaticallyProvable&lt;Rule&gt;&gt; Deducible&lt;Rule&gt; for T {     fn deduce(_: Rule) -&gt; Self {         Self::proof()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043e\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_nat-svoystva-chisel-i-operaciy-dubl-2\"><code>qd_nat<\/code>: \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0438\u0441\u0435\u043b \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0434\u0443\u0431\u043b\u044c 2<\/h3>\n<p>  <\/p>\n<p>\u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct Refl; impl&lt;N: Nat&gt; StaticallyProvable&lt;Refl&gt; for Equiv&lt;N, N&gt; {     fn proof() -&gt; Self {         Self::refl()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u2014 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f <code>Refl<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442\u0438\u043f\u0430\u0436\u0430.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct Symmetric; impl&lt;N1: Nat, N2: Nat&gt; StaticallyProvable&lt;Symmetric&gt; for Equiv&lt;Add&lt;N1, N2&gt;, Add&lt;N2, N1&gt;&gt; {     fn proof() -&gt; Self {         Self(PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0430\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043d\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u0430\u0436\u0438: \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0434\u0432\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043e\u0431 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub struct Associative; impl&lt;N1: Nat, N2: Nat, N3: Nat&gt; StaticallyProvable&lt;Associative&gt;     for Equiv&lt;Add&lt;N1, Add&lt;N2, N3&gt;&gt;, Add&lt;Add&lt;N1, N2&gt;, N3&gt;&gt; {     fn proof() -&gt; Self {         Self(PhantomData)     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <code>Add<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl&lt;N1: Nat, N2: Nat&gt; Add&lt;N1, N2&gt; {     pub fn sum(_: N1, _: N2) -&gt; Self {         Self::get()     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u043d\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>accepts_pair<\/code>, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn proved() {     use qd_nat::with_n;     use qd_core::StaticallyProvable;      let n1 = with_n!(N::from_usize(1).unwrap());     \/\/ \u0420\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0432\u043d\u043e - n1 == n1.     accepts_pair(n1, n1, Equiv::proof());      let n2 = with_n!(N::from_usize(2).unwrap());      \/\/ \u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0434\u043b\u044f &quot;\u0441\u043b\u043e\u0436\u043d\u044b\u0445&quot; \u0447\u0438\u0441\u0435\u043b.     accepts_pair(Add::sum(n1, n2), Add::sum(n1, n2), Equiv::proof());     \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e = n1 + n2 == n2 + n1.     accepts_pair(Add::sum(n1, n2), Add::sum(n2, n1), Equiv::proof());      let n3 = with_n!(N::from_usize(3).unwrap());     \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e: n1 + (n2 + n3) == (n1 + n2) + n3.     accepts_pair(Add::sum(n1, Add::sum(n2, n3)), Add::sum(Add::sum(n1, n2), n3), Equiv::proof()); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b\u0445 <code>unwrap<\/code>-\u043e\u0432 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0447\u0438\u0441\u0435\u043b). \u041d\u0430\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e: \u043e\u043d\u0438 \u0432\u0441\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c\u0438 \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0435 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u043d\u0430\u044f. \u0422\u0430\u043a, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 (\u0438\u0437 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u043e\u0432):<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn proved() {     \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a     accepts_pair(         Add::sum(Add::sum(n1, n2), n3),         Add::sum(n1, Add::sum(n2, n3)),         Equiv::deduce(Equiv::proof()),     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u043d\u043e \u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[test] fn proved() {     \/\/ \u043f\u0440\u043e\u043f\u0443\u0441\u043a     accepts_pair(         Add::sum(n1, Add::sum(n2, n3)),         Add::sum(n3, Add::sum(n1, n2)),         Equiv::deduce((             Equiv::prove_by_rule(Associative),             Equiv::proof()         )),     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445. \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 Rust \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0430\u043c.<\/li>\n<li>\u041f\u0440\u0438\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. \u0417\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u043c\u043e\u0449\u044c \u2014 \u0438 \u043c\u044b \u0435\u0451 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0432, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0418\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0442\u0440\u0435\u0442\u044c\u0435, \u0438\u0441\u043a\u043e\u043c\u043e\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<h3 id=\"qd_vect-konkatenaciya-so-staticheskoy-proverkoy\"><code>qd_vect<\/code>: \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u043a \u043d\u0430\u0448\u0438\u043c \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u043e\u0434\u0437\u0430\u0431\u044b\u0442\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c. \u0422\u0435\u043f\u0435\u0440\u044c, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u043e\u0432\u043e\u043e\u0431\u0440\u0435\u0442\u0451\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f - \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b fn equiv&lt;T: Clone + PartialEq&lt;T&gt;, N: Nat&gt;(first: Vect&lt;T, N&gt;, second: Vect&lt;T, N&gt;) -&gt; bool {     first         .freeze()         .iter()         .zip(second.freeze())         .all(|(i1, i2)| i1 == i2) }  #[test] fn concats() {     let (_, v1) = vect!(vec![1]);     let (n2, v2) = vect!(vec![2, 3]);      \/\/ \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.     let v12 = v1.clone().concat(v2.clone());     let v21 = v2.clone().concat(v1.clone());      \/\/ \u0418\u0445 \u0434\u043b\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c - \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.     let sum = zip_sum(v12, v21.retag(Equiv::proof()));     assert_eq!(sum.into_native(), vec![3, 5, 4]);      let (n3, v3) = vect!(vec![4, 5]);     let v12 = v1.clone().concat(v2);     let v13 = v1.concat(v3);      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e v2 \u0438 v3 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0432\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443     match Equiv::try_prove_for(n2, n3) {         Some(proof) =&gt; {             \/\/ ...\u0430 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a, \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0445\u043e\u0442\u044c v2, \u0445\u043e\u0442\u044c v3 -             \/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439, \u0438 \u044d\u0442\u043e \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438             let sum = zip_sum(v12.retag(Equiv::deduce(proof)), v13);             assert_eq!(sum.into_native(), vec![2, 6, 8]);         }         None =&gt; panic!(&quot;2 != 2, WTF?&quot;),     }      \/\/ \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u0435\u0441\u0442 \u043d\u0430 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c     \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0430 ((v1, v2), v3)     let v_12_3 = v1.clone().concat(v2.clone()).concat(v3.clone());     \/\/ \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0430 (v1, (v2, v3))     let v_1_23 = v1.concat(v2.concat(v3));     \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432 - \u0438 \u043f\u043e \u0434\u043b\u0438\u043d\u0435, \u0438 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e     assert!(equiv(v_1_23.retag(Equiv::proof()), v_12_3)); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0438 \u043e \u043a\u0430\u043a\u043e\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0440\u0435\u0447\u0438 \u043d\u0435 \u0438\u0434\u0451\u0442 \u2014 \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u0435\u043c \u0432\u0438\u0434\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0438 \u0432 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/477330\/\"> https:\/\/habr.com\/ru\/post\/477330\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/477330\/\">\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u2014 \u044d\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0431\u0435\u0437\u0443\u043c\u0438\u0435.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y0\/cp\/de\/y0cpdecpzjvzezlr09zet6hvtfw.png\" alt=\"\u041a\u0414\u041f\u0412 \u0432 \u043f\u043e\u0434\u0440\u0430\u0436\u0430\u043d\u0438\u0435 XKCD\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0451\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0432 compile-time \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 Rust. \u041a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043b\u043e\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u0442\u043e\u0433\u0434\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u043d\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u043b \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/468145\/#comment_20652891\">\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/a>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e-\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c Idris.<br \/>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044f \u043d\u0435 \u043c\u043e\u0433 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/Cerberuser\/quasidependent_types\" rel=\"nofollow\">\u043d\u0430 github<\/a>, \u0430 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-304935","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304935","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=304935"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304935\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}