{"id":443088,"date":"2024-12-26T04:55:10","date_gmt":"2024-12-26T04:55:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=443088"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=443088","title":{"rendered":"<span>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0427\u0430\u0441\u0442\u044c 2\/5. \u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ef\/a8b\/e74\/5efa8be7409525ed5ccc6f668a8dddd1.png\" alt=\"\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\" title=\"\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\" width=\"842\" height=\"561\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ef\/a8b\/e74\/5efa8be7409525ed5ccc6f668a8dddd1.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"#rec_types_init\" rel=\"noopener noreferrer nofollow\">\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_fixed_point\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_algebras\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f F-\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_gfp\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#rec_class_types\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/a><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0414\u0440\u0443\u0433\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/article\/863304\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 1. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863324\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2. \u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/a>\u00a0(\u043c\u044b \u0437\u0434\u0435\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863334\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 3. \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863362\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 4. \u0421\u0445\u0435\u043c\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863376\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 5. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0442\u0430\u043d<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"rec_types_init\" id=\"rec_types_init\"><\/a><\/p>\n<h2>\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0441\u043f\u0435\u043a\u0442, \u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u044b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0431\u044b\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041c\u044b \u0432\u043d\u043e\u0432\u044c \u0438 \u0432\u043d\u043e\u0432\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u00ab\u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0438\u00bb \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type OptCell = [A] =&gt;&gt; [X] =&gt;&gt; Option[(A, X)] \/\/ 1 + A \u00d7 X  type List3 = [A] =&gt;&gt; OptCell[A][OptCell[A][OptCell[A][Unit]]] \/\/   List3 = 1 + A \u00d7 (1 + A \u00d7 (1 + A \u00d7 1)) \u2245 1 + A + A \u00d7 A + A \u00d7 A \u00d7 A  val lst3: List3[Int] = Some(1, Some(2, Some(3, ()))) \/\/ (1, 2, 3)<\/code><\/pre>\n<p>\u0422\u0438\u043f <code>List3<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u00ab\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a\u00bb \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u0438\u043d\u043d\u044b 0, 1, 2 \u0438 3. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>lst3<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u044b 3.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u0442\u0430\u043a\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432:<\/p>\n<pre><code class=\"scala\">def foldList3[A, B](b: B, comb: (A, B) =&gt; B) = (lst: List3[A]) =&gt;   lst match     case None =&gt; b     case Some(a: A, x) =&gt;       val acc1 = comb(a, b)       x match         case None =&gt; acc1         case Some(a, x) =&gt;           val acc2 = comb(a, acc1)           x match             case None =&gt; acc2             case Some(a, _) =&gt; comb(a, acc2)  val foldToString = foldList3(\"foldList3: \", (i: Int, s: String) =&gt; s + i + \" \") foldToString(lst3) \/\/ \"foldList3: 1 2 3\"<\/code><\/pre>\n<p>\u0411\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0435 (\u043d\u0443, \u043f\u043e\u0447\u0442\u0438) \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u0442\u0435\u043b\u0435 <code>foldList3<\/code>, \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>List3<\/code>, \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445 <code>OptCell<\/code>. \u041d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u2013 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0431\u044b \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0438\u0445 \u0434\u043b\u0438\u043d\u0443. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <code>List_\u221e<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d \u0441\u0443\u043c\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0434\u043b\u0438\u043d. \u0412\u043e\u0442 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">case class List_\u221e[A](cell: OptCell[A][List_\u221e[A]])<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>List_\u221e<\/code> \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u0441\u0432\u0451\u0440\u0442\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439:<\/p>\n<pre><code class=\"scala\">def foldList_\u221e[A, B](lst: List_\u221e[A], b: B, comb: (A, B) =&gt; B): B =   lst.cell match     case None             =&gt; b     case Some(head, tail) =&gt; foldList_\u221e(tail, comb(head, b), comb)     \/\/                         \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 - \u0432\u044b\u0437\u043e\u0432 \u0441\u0435\u0431\u044f \u0436\u0435 val lst4 = List_\u221e(Some(1, List_\u221e(Some(2, List_\u221e(Some(3, List_\u221e(Some(4, List_\u221e(None)))))))))  foldList_\u221e(lst4, \"foldList_\u221e: \", (i: Int, s: String) =&gt; s + i + \" \") \/\/ foldList_\u221e: 1 2 3 4<\/code><\/pre>\n<p>\u0418, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438\u0437 \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 <strong>\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/strong>:<\/p>\n<pre><code class=\"scala\">type FoldIterState[A, B] = (List_\u221e[A], B, (A, B) =&gt; B) type FoldFunc[A, B] = FoldIterState[A, B] =&gt; B  def foldListBase[A, B]: FoldFunc[A, B] =&gt; FoldFunc[A, B] =   self =&gt; (lst, b, comb) =&gt;   lst.cell match     case None             =&gt; b     case Some(head, tail) =&gt; self(tail, comb(head, b), comb)  def foldList[A, B] = fix(foldListBase[A, B])<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <em>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/em>. \u042d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u0438\u0437 \u0441\u0440\u0435\u0434\u044b \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u043e\u0432, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u0438\u0440\u043e\u0434\u0443 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0441\u043c., <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#type_constructors\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e<\/a>), \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0434\u043d\u0438 \u0442\u0438\u043f\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u043e\u0432\u044b\u0435. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#type_kind\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432<\/a>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split}OptCell[A] &amp;: \\star \\rightarrow \\star,\\\\List_\\infty[A] &amp;: \\star,\\\\\\end{split}\" alt=\"\\begin{split}OptCell[A] &amp;: \\star \\rightarrow \\star,\\\\List_\\infty[A] &amp;: \\star,\\\\\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a57\/530\/752\/a5753075244cb3895b771b73a97af398.svg\" width=\"169\" height=\"49\"\/><\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\star\" alt=\"\\star\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4b\/4b4\/4b4efc2fbe82a047fc08c83ea081f1d9.svg\" width=\"auto\" height=\"auto\"\/> \u2013 \u044d\u0442\u043e \u0432\u0438\u0434 <em>\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/em> \u0442\u0438\u043f\u0430. \u0422\u0438\u043f <code>List_\u221e<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432 \u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0434\u043b\u044f <code>OptCell<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <img decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c6\/c6a\/c6a6eb61fd9c6c913da73b3642ca147d.svg\" width=\"auto\" height=\"auto\"\/>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u2013 <img decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c6\/c6a\/c6a6eb61fd9c6c913da73b3642ca147d.svg\" width=\"auto\" height=\"auto\"\/>-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/System_F#System_F%CF%89\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430 F\u03c9<\/a>) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432!<\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f\u00bb \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a \u043d\u0438\u043c \u0442\u0435 \u0436\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0430\u0441\u0441 <code>List_\u221e<\/code> \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0436\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0447\u0435\u0440\u0435\u0437 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">type List_\u221e = [A] =&gt;&gt; OptCell[A][List_\u221e[A]] \/\/ \u041e\u0428\u0418\u0411\u041a\u0410 \u041a\u041e\u041c\u041f\u0418\u041b\u042f\u0426\u0418\u0418 \/\/ illegal cyclic type reference: alias ... of type Lst_\u221e refers back to the type itself <\/code><\/pre>\n<p>\u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u0432 Scala 3 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0430\u0445 \u0442\u0438\u043f\u043e\u0432, \u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u043b\u0435\u043f\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439\u2026<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0435\u0449\u0451 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 Scala \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"type_fixed_point\" id=\"type_fixed_point\"><\/a><\/p>\n<h2>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/h2>\n<p>\u041f\u0440\u044f\u043c\u044b\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 <code>fix: (A =&gt; A) =&gt; A<\/code>, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"scala\">case class Fix[F[_]](val: F[Fix[F]]) \/\/ Fix: (\u22c6 \u2192 \u22c6) \u2192 \u22c6<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Fix<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <em>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e<\/em> \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0435\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code> \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435: <code>F[F[F[\u2026\u221e\u2026]]]<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Fix<\/code>:<\/p>\n<pre><code class=\"scala\">type List[A] = Fix[OptCell[A]] val list: List[Int] = Fix(Some(1, Fix(Some(2, Fix(Some(3, Fix(None))))))) \/\/ (1, 2, 3)<\/code><\/pre>\n<p>\u0418, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0443 <code>fixf<\/code>, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code class=\"scala\">case class FixF[RecBase[_[_], _], A](v: RecBase[[X] =&gt;&gt; FixF[RecBase, X], A])<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u2013 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>FixF<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0435\u043c\u0443, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0435 <code>Fix<\/code>. \u041d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>FixF<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0438\u0431\u0447\u0435 \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438\u00bb:<\/p>\n<pre><code class=\"scala\">type TreeBase = [Self[_], A] =&gt;&gt; Option[(A, Self[A], Self[A])] type Tree     = [A]          =&gt;&gt; FixF[TreeBase, A]  val \u2205   : Tree[Nothing] = FixF(None) val tree: Tree[Int]     = FixF(Some(4, \u2205, FixF(Some(2, \u2205, \u2205)))) \/\/    4 \/\/                                                                   \/  \\ \/\/                                                                  \u2205    2 \/\/                                                                      \/  \\ \/\/                                                                     \u2205    \u2205<\/code><\/pre>\n<p>\u0412\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 <code>TreeBase<\/code> \u0438 <code>FixF<\/code> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 Scala, \u043d\u043e \u0443 \u043d\u0438\u0445 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f <strong>\u0442\u0435 \u0436\u0435 \u0447\u0435\u0440\u0442\u044b<\/strong>, \u0447\u0442\u043e \u0438 \u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split}TreeBase:&amp;\\,\\,\\,\\, (\\star \\rightarrow \\star,\\; \\star) \\rightarrow \\star \\;\\;&amp;&amp;\\cong\\,\\,\\,\\,(\\star \\rightarrow \\star) \\rightarrow (\\star \\rightarrow \\star)\\\\FixF:&amp;\\; ((\\star \\rightarrow \\star,\\; \\star) \\rightarrow \\star,\\; \\star) \\rightarrow \\star \\;\\;&amp;&amp;\\cong\\;((\\star \\rightarrow \\star) \\rightarrow (\\star \\rightarrow \\star)) \\rightarrow (\\star \\rightarrow \\star)\\\\\\end{split}\" alt=\"\\begin{split}TreeBase:&amp;\\,\\,\\,\\, (\\star \\rightarrow \\star,\\; \\star) \\rightarrow \\star \\;\\;&amp;&amp;\\cong\\,\\,\\,\\,(\\star \\rightarrow \\star) \\rightarrow (\\star \\rightarrow \\star)\\\\FixF:&amp;\\; ((\\star \\rightarrow \\star,\\; \\star) \\rightarrow \\star,\\; \\star) \\rightarrow \\star \\;\\;&amp;&amp;\\cong\\;((\\star \\rightarrow \\star) \\rightarrow (\\star \\rightarrow \\star)) \\rightarrow (\\star \\rightarrow \\star)\\\\\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a41\/a7e\/4c4\/a41a7e4c48a7f7f12a7d9ebe3d5cb916.svg\" width=\"621\" height=\"49\"\/><\/p>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e <code>FixF<\/code> \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split}FixF&amp;:&amp;((\\pm\\star \\rightarrow \\star) \\rightarrow (\\pm\\star \\rightarrow \\star)) \\rightarrow (\\pm\\star \\rightarrow \\star)\\\\\\end{split}\" alt=\"\\begin{split}FixF&amp;:&amp;((\\pm\\star \\rightarrow \\star) \\rightarrow (\\pm\\star \\rightarrow \\star)) \\rightarrow (\\pm\\star \\rightarrow \\star)\\\\\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb5\/553\/6f7\/bb55536f76bae7ca0a7a1bc919fe1541.svg\" width=\"376\" height=\"23\"\/><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u0432\u0435\u0440\u0445\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u043d\u0438\u0436\u043d\u0438\u0435 \u0437\u043d\u0430\u043a\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, Scala \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0442\u0438\u043f\u0430\u043c\u0438-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <code>TreeBase<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438 \u0443 <code>Self<\/code>, \u0438 \u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<code>FixF<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0437\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u043a <code>+<\/code>, \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435:<\/p>\n<pre><code class=\"scala\">case class FixContra[RecBase[_[-_], -_], -A](v: RecBase[[X] =&gt;&gt; FixContra[RecBase, X], A]) type WtfBase = [Self[-_], A] =&gt;&gt; Option[Self[Self[A]]] =&gt; String type Wtf[A]  = FixContra[WtfBase, A] \/\/ \u2191\u2191\u2191\u2191-\u2191\u2191\u2191\u2191 - \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438))  val wtf: Wtf[Int] = opt =&gt; ??? \/\/                  \u2191\u2191\u2191 - \u043e\u0448\u0438\u0431\u043a\u0430! \u0442\u0438\u043f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c!!!<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <em>\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c<\/em> \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0442\u0435\u0440\u043c\u0430 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f). \u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f<\/em>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <em>\u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b<\/em>. \u0418\u0445 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <em>\u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435<\/em>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0433\u043e\u0432 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/Iltotore\/iron\" rel=\"noopener noreferrer nofollow\">iron<\/a>, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 (+\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435) \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438. \u0412\u043e\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type ContStr[+A] = (A =&gt; String) =&gt; String type ContRec = Fix[ContStr] val  contRec: ContRec = Fix((f: Fix[ContStr] =&gt; String) =&gt; ???) \/\/                     \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c? \u2191\u2191\u2191<\/code><\/pre>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f <code>ContStr<\/code> \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439, \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0422\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>f<\/code> \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0432\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>f: Fix[ContStr] =&gt; String<\/code> \u043e\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e <em>\u0447\u0435\u0441\u0442\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e! \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 <em>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439<\/em> \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0442\u0435\u0445 \u0436\u0435 <code>Fix<\/code>, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>contRec<\/code>. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u00ab\u0447\u0438\u0442\u0435\u0440\u0441\u043a\u0438\u0435\u00bb \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u0432\u0440\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>toString<\/code>, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0433\u043e \u043a \u0442\u0435\u0440\u043c\u0430\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/p>\n<blockquote>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <u>\u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435<\/u> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 (\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438).<\/p>\n<\/blockquote>\n<p><a class=\"anchor\" name=\"type_algebras\" id=\"type_algebras\"><\/a><\/p>\n<h2>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f F-\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/h2>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 <code>I = Fix[F]<\/code> \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#algebra\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u0442\u0438\u043f\u043e\u0432<\/a> <img decoding=\"async\" class=\"formula inline\" source=\"F[I] \\cong I\" alt=\"F[I] \\cong I\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3d\/3d8\/3d8545dab8178a0e4ebd08fb4123b548.svg\" width=\"auto\" height=\"auto\"\/>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 <code>I<\/code> \u0438 <code>F[I]<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u00ab\u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u00bb, \u043f\u0440\u0438\u0447\u0451\u043c \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Fix<\/code> \u0442\u0430\u043a\u043e\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440 <code>unfix<\/code>, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0412\u044b\u043f\u0438\u0448\u0435\u043c \u0442\u0438\u043f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"scala\">type Algebra[F[_]] = [X] =&gt;&gt; X =&gt; F[X] \/\/ Algebra: (\u22c6 \u2192 \u22c6) \u2192 (\u22c6 \u2192 \u22c6)<\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u00ab<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/em>\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0438\u0437-\u0437\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0439. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Algebra[F]<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 <code>F[_]<\/code> \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>X<\/code> \u0432 \u043d\u0435\u0433\u043e \u0436\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0438\u043f\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"Algebra[OptCell[X]][X] \\cong 1 + X \\times X \\Rightarrow X\" alt=\"Algebra[OptCell[X]][X] \\cong 1 + X \\times X \\Rightarrow X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/eb\/eb4\/eb4e26b57f78b214641076bb9aeecdea.svg\" width=\"auto\" height=\"auto\"\/> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u00ab\u0430\u0440\u043d\u043e\u0441\u0442\u0438\u00bb:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\begin{split}&amp;zero:\\; 1 (= X^0) \\Rightarrow X;\\;\\; &amp;- \\;\\;\\text{\u043d\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (\u0441\u043b\u0435\u0432\u0430 0 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 X),}\\\\&amp;cobm: X \\times X (= X^2) \\Rightarrow X\\;\\; &amp;- \\;\\;\\text{\u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (\u0441\u043b\u0435\u0432\u0430 2 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 X).}\\end{split}\" alt=\"\\begin{split}&amp;zero:\\; 1 (= X^0) \\Rightarrow X;\\;\\; &amp;- \\;\\;\\text{\u043d\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (\u0441\u043b\u0435\u0432\u0430 0 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 X),}\\\\&amp;cobm: X \\times X (= X^2) \\Rightarrow X\\;\\; &amp;- \\;\\;\\text{\u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (\u0441\u043b\u0435\u0432\u0430 2 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 X).}\\end{split}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/454\/e05\/51c\/454e0551c8ef17f0dfc5f396e285d1b1.svg\" width=\"604\" height=\"52\"\/><\/p>\n<p>\u00ab\u041a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439\u00bb \u0436\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u044b \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<p>\u041d\u043e \u0432 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435 \u0441\u0430\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <code>Algebra[F]<\/code>, \u0430 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>X<\/code>, \u043e\u0431\u043e\u0433\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u044d\u0442\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 <code>(X, Algebra[F][X])<\/code>. \u042d\u0442\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0434 <em>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 F-\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439<\/em> \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">type \u03bc[F[_]] = [X] =&gt; Algebra[F][X] =&gt; X \/\/ \u03bc[F[_]] = Algebra[F] ~&gt; Id<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043b\u0430\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u00ab\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439\u00bb \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043e \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b <code>\u03bc[F]<\/code>,  \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u0430\u043b\u0433\u0435\u0431\u0440\u0443 <code>X<\/code>, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u0430 <code>Algebra[F][X]<\/code>. \u0414\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00ab\u0441\u0432\u0451\u0440\u0442\u043a\u0438\u00bb (fold), \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 <code>F[F[\u2026\u221e\u2026]]<\/code> \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00ab\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u00bb \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">def fold\u03bc[F[_]]: [X] =&gt; Algebra[F][X] =&gt; \u03bc[F] =&gt; X =   [X] =&gt; (alg: Algebra[F][X]) =&gt; (\u03bcF: \u03bc[F]) =&gt; \u03bcF(alg)<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e <code>\u03bc[F]<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f <code>F[_]<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0442\u0438\u043f\u044b <code>\u03bc[F]<\/code> \u0438 <code>F[\u03bc[F]]<\/code> \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b. \u0421\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 <code>F[+_]<\/code> \u2013 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Lift<\/code> (\u0441\u043c. <a href=\"https:\/\/habr.com\/ru\/articles\/807485\/#container_typeclasses\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e<\/a>):<\/p>\n<pre><code class=\"scala\">type Lift[F[_]] = [A, B] =&gt; (A =&gt; B) =&gt; (F[A] =&gt; F[B]) def fmap[F[_] : Lift] = summon[Lift[F]] extension [F[_]: Lift, A](fa: F[A])   def map[B] = (f: A =&gt; B) =&gt; fmap(f)(fa)<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Algebra[F][\u03bc[F]]<\/code> \u0438 <code>Coalgebra[F][\u03bc[F]]<\/code> (\u043e\u0431\u0435 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u0430\u044e\u0442 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e):<\/p>\n<pre><code class=\"scala\">def in\u03bc [F[_]: Lift]:   Algebra[F][\u03bc[F]] = f\u03bcF =&gt; [X] =&gt; (alg: Algebra[F][X]) =&gt; alg(fmap(fold\u03bc(alg))(f\u03bcF)) def out\u03bc[F[_]: Lift]: Coalgebra[F][\u03bc[F]] = fold\u03bc(fmap(in\u03bc))<\/code><\/pre>\n<p>\u0421\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>\u03bc<\/code> \u0442\u0438\u043f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0441 <code>Fix<\/code>, \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b <code>nil<\/code> \u0438 <code>cons<\/code>:<\/p>\n<pre><code class=\"scala\">type List[X] = \u03bc[OptCell[X]]  given [X]: Lift[OptCell[X]] = \/\/ \u0434\u043e\u043a\u0430\u0437\u0430\u0435\u0442\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 OptCell[X]: \u22c6 \u2192 \u22c6   [A, B] =&gt; (f: A =&gt; B) =&gt; (optCell: OptCell[X][A]) =&gt;     optCell map {case (x, a) =&gt; (x, f(a))}  def nil [A]                         : \u03bcList[A] = in\u03bc(None            ) def cons[A](head: A, tail: \u03bcList[A]): \u03bcList[A] = in\u03bc(Some(head, tail))<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b:<\/p>\n<pre><code class=\"scala\">def lst: List[Int] = cons(1, cons(2, cons(3, nil)))  def   listAlgebra[A]: Algebra[OptCell[A  ]][List[A]] = _.fold( Nil )((h, t) =&gt; h :: t) val stringAlgebra   : Algebra[OptCell[Int]][String ] = _.fold(\"nil\")((i, s) =&gt; s\"$i, $s\")  fold\u03bc(  listAlgebra)(lst) \/\/ List(1, 2, 3) fold\u03bc(stringAlgebra)(lst) \/\/     \"1, 2, 3, nil\"<\/code><\/pre>\n<p>\u041d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 <code>Fix[F]<\/code> \u0438 <code>\u03bc[F]<\/code> \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"scala\">def \u0442\u0443\u0434\u0430[F[_]: Lift]: Fix[F] =&gt; \u03bc[F] =   fixf =&gt; [X] =&gt; (alg: F[X] =&gt; X) =&gt;     alg(fmap(       \u0442\u0443\u0434\u0430(_: Fix[F])(alg))( \/\/ \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443       fixf.unfix     )) def \u043e\u0431\u0440\u0430\u0442\u043d\u043e[F[_]: Lift]: \u03bc[F] =&gt; Fix[F] = fold\u03bc(Fix.apply)  assert((\u0442\u0443\u0434\u0430    andThen \u043e\u0431\u0440\u0430\u0442\u043d\u043e)(fixList)            == fixList)            \/\/ \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 fixList: Fix[OptCell] assert((\u043e\u0431\u0440\u0430\u0442\u043d\u043e andThen \u0442\u0443\u0434\u0430   )(\u03bcList)(listAlgebra) == \u03bcList(listAlgebra)) \/\/ \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445   \u03bcList:   \u03bc[OptCell]<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>\u0442\u0443\u0434\u0430<\/code>\/<code>\u043e\u0431\u0440\u0430\u0442\u043d\u043e<\/code>, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438, \u0438 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>\u03bc[_[_]]<\/code>:<\/p>\n<pre><code class=\"scala\">def unsafeFix: \u03bc[Id] =   [A] =&gt; (f: A =&gt; A) =&gt; f(fix(f)) \/\/ \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442 \u0441\u0442\u0435\u043a!<\/code><\/pre>\n<p>\u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 <code>\u03bc<\/code> (\u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0439 \u0435\u043c\u0443 <code>Fix<\/code>) \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u0430\u043a\u0436\u0435 <em>\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439<\/em> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>F[_]<\/code>. \u0421\u0443\u0442\u044c \u00ab\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0441\u0442\u0438\u00bb \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0434\u0430\u043b\u0435\u0435, \u0441\u0440\u0430\u0432\u043d\u0438\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 <code>nil<\/code> \u0438 <code>cons<\/code> \u0442\u0438\u043f\u0430 <code>List[A] = \u03bc[OptCell[A]]<\/code>, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u0451\u043c \u00ab\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430 \u0441\u0447\u0451\u0442 \u00ab\u043f\u0440\u0438\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f\u00bb \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 <em>\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438<\/em>. \u0412\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Scala \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f <img decoding=\"async\" class=\"formula inline\" source=\"OptCell[A][X] = 1 + A \\times X\" alt=\"OptCell[A][X] = 1 + A \\times X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e6a\/e6a481721446cc3c48f6aae790dc77d3.svg\" width=\"auto\" height=\"auto\"\/> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a <a href=\"https:\/\/www.scala-lang.org\/api\/current\/scala\/collection\/immutable\/List.html\" rel=\"noopener noreferrer nofollow\">List<\/a>.<\/p>\n<p>\u0418\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"https:\/\/typelevel.org\/blog\/2014\/04\/14\/fix.html\" rel=\"noopener noreferrer nofollow\">PRIMITIVE RECURSION WITH FIX AND MU<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"type_gfp\" id=\"type_gfp\"><\/a><\/p>\n<h2>\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/h2>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 F-\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439 <code>\u03bc[F]<\/code>, \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0436\u0438\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u00ab\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb (\u0441\u0432\u0451\u0440\u0442\u043a\u0438) \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e-\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>F[F[\u2026\u221e\u2026]]<\/code>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 <em>\u0434\u0443\u0430\u043b\u044c\u043d\u0443\u044e<\/em> \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u2013 <em>\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e F-\u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u0443<\/em>, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0438\u0434\u0435\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u00ab\u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0438\u00bb (\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438). \u0414\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0447\u0435\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b)). \u0415\u0441\u043b\u0438 \u0432 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u03bb-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\mu\\, F  =  \\forall X. (F[X] \\rightarrow X) \\rightarrow X\" alt=\"\\mu\\, F  =  \\forall X. (F[X] \\rightarrow X) \\rightarrow X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e76\/ada\/101\/e76ada101b1dca4e5c06ced188295969.svg\" width=\"240\" height=\"22\"\/><\/p>\n<p>\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\nu\\, F  =  \\exists X. (X \\rightarrow F[X]) \\times X\" alt=\"\\nu\\, F  =  \\exists X. (X \\rightarrow F[X]) \\times X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e3\/950\/c29\/1e3950c295192b4bca399adf72e22120.svg\" width=\"232\" height=\"22\"\/><\/p>\n<p>\u00ab\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f <code>X<\/code>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>X<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437 <code>X<\/code> \u0432 <code>F[X]<\/code>\u00bb. \u0422\u0438\u043f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u044e\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Coalgebra[F]<\/code> \u2013 \u0434\u0443\u0430\u043b\u044c\u043d\u043e <code>Algebra[F]<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 <code>X<\/code> \u0438 \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Coalgebra[F][X]<\/code> \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u0430\u0440\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e\u00bb (\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e) \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>F[X]<\/code>.<\/p>\n<pre><code class=\"scala\">type Coalgebra[F[_]] = [X] =&gt;&gt; X =&gt; F[X]            \/\/ Coalgebra: (\u22c6 \u2192 \u22c6) \u2192 (\u22c6 \u2192 \u22c6) type LazyFx   [F[_]] = [X] =&gt;&gt; (X, Coalgebra[F][X]) \/\/ LazyFx   : (\u22c6 \u2192 \u22c6) \u2192 (\u22c6 \u2192 \u22c6)  def eval[F[_], X]: LazyFx[F][X] =&gt; F[X] =           \/\/ \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u00ab\u043e\u0446\u0435\u043d\u043a\u0430\u00bb \u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u044b   case (x, coalgebra) =&gt; coalgebra(x)<\/code><\/pre>\n<p>\u042d\u043a\u0437\u0438\u0441\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0434\u043b\u044f Scala \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"scala\">trait Existential[F[_]] { type T; val value: F[T] } type \ud835\udece[F[_]] = Existential[LazyFx[F]] \/\/ \ud835\udece: (\u22c6 \u2192 \u22c6) \u2192 \u22c6<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 F-\u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u044b \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 <code>X<\/code> \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0438\u043f\u043e\u0432 <code>Coalgebra[F][X]<\/code> (\u0442\u043e \u0431\u0438\u0448\u044c, \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>LazyFx[F][X]<\/code>). \u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u043e\u0439\u00bb:<\/p>\n<pre><code class=\"scala\">def unfold\ud835\udece[F[_]]: [X] =&gt; LazyFx[F][X] =&gt; \ud835\udece[F] =   [X] =&gt; (coalg: Coalgebra[F][X]) =&gt; (x: X) =&gt;     new Existential[LazyFx[F]]:       type T = X       val value = LazyFx(x, coalg)<\/code><\/pre>\n<p>\u041b\u0435\u043d\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f \u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u044b <code>LazyFx[F]<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>\ud835\udece<\/code> \u2013 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442  \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u00ab\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u043d\u0435\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443. \u0422\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442  \u00ab<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439<\/a>\u00bb, \u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u2013 \u00ab<a href=\"https:\/\/ru.wikipedia.org\/w\/index.php?title=%D0%9A%D0%BE%D0%B8%D0%BD%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D1%8F%C2%A7ion=0#:~:text=%D0%B8%C2%A0%D1%82.%C2%A0%D0%B4.-,%D0%9A%D0%BE%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5,-%5B%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%7C\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/a>\u00bb<\/p>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0441\u0442\u044c <code>F<\/code> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e <code>\ud835\udece[F]<\/code> \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c:<\/p>\n<pre><code class=\"scala\">def out\ud835\udece[F[_]: Lift]: Coalgebra[F][\ud835\udece[F]] =  \ud835\udeceF =&gt; fmap((x: \ud835\udeceF.T) =&gt; unfold\ud835\udece(\ud835\udeceF.value.coalgebra)(x))(\ud835\udeceF.value.eval) def  in\ud835\udece[F[_]: Lift]:   Algebra[F][\ud835\udece[F]] = f\ud835\udeceF =&gt; unfold\ud835\udece(fmap(out\ud835\udece))(f\ud835\udeceF)  assert((out\ud835\udece andThen  in\ud835\udece)( \ud835\udeceF) ==  \ud835\udeceF) \/\/ \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445  \ud835\udeceF:   \ud835\udece[F] assert(( in\ud835\udece andThen out\ud835\udece)(f\ud835\udeceF) == f\ud835\udeceF) \/\/ \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 f\ud835\udeceF: F[\ud835\udece[F]]<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>\ud835\udece[F]<\/code> \u043d\u0430 \u0432\u0441\u0451 \u0442\u043e\u043c \u0436\u0435 <code>F[_] = OptCell[A][_]<\/code>. \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0451\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432:<\/p>\n<pre><code class=\"scala\">type \ud835\udeceList[A] = \ud835\udece[OptCell[A]]  val factCoalg10: Coalgebra[OptCell[Int]][(Int, Int)] =   case (n: Int, fact: Int) =&gt; \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f     Option.when(n &lt;= 10)(     \/\/ \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 (\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c!)       fact,                   \/\/ \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435       (n + 1, fact * (n + 1)) \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438     )  val factorial10: \ud835\udeceList[Int] =   unfold\ud835\udece[OptCell[Int]](factCoalg10)(0, 1) \/\/\u2191\u2191\u2191\u2191\u2191\u2191                \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191  \u2191\u2191\u2191\u2191\u2191\u2191 \/\/\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430              \u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u0430   \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (0! = 1)<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0443\u0436\u043d\u043e \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e F-\u0430\u043b\u0433\u0435\u0431\u0440\u044b \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 <code>F<\/code>:<\/p>\n<pre><code class=\"scala\">def fold\ud835\udece[F[_]: Lift, X](alg: Algebra[F][X]): \ud835\udece[F] =&gt; X =   \ud835\udeceF =&gt; alg(fmap(fold\ud835\udece(alg))(out\ud835\udece(\ud835\udeceF)))  fold\ud835\udece(  listAlgebra)(factorial10) \/\/ List(1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800) fold\ud835\udece(stringAlgebra)(factorial10) \/\/     \"1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, nil\"<\/code><\/pre>\n<p>\u0412 Scala \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <a href=\"https:\/\/www.scala-lang.org\/api\/current\/scala\/collection\/immutable\/LazyList.html\" rel=\"noopener noreferrer nofollow\">LazyList<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043b\u044f <img decoding=\"async\" class=\"formula inline\" source=\"OptCell[A][X] = 1 + A \\times X\" alt=\"OptCell[A][X] = 1 + A \\times X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e6a\/e6a481721446cc3c48f6aae790dc77d3.svg\" width=\"auto\" height=\"auto\"\/>.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u044b <code>\u03bc<\/code> \u0438 <code>\ud835\udece<\/code> \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u00ab\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439\u00bb \u0438 \u00ab\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439\u00bb \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439? \u0427\u0435\u043c \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0438 \u0435\u0441\u0442\u044c \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0435\u0449\u0451 \u00ab\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435\u00bb \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435  \u0442\u043e\u0447\u043a\u0438?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430 \u0443\u0431\u0440\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u0443, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0443\u044e \u00ab\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"F[F[\\ldots\\infty\\ldots]]\" alt=\"F[F[\\ldots\\infty\\ldots]]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/83\/832\/832d9e1c3410ade40674511327f9f175.svg\" width=\"auto\" height=\"auto\"\/>:<\/p>\n<pre><code class=\"scala\">val factorial_\u221e : \ud835\udeceList[Int] =   unfold\ud835\udece[OptCell[Int]][(Int, Int)](     (n: Int, fact: Int) =&gt; Some(fact -&gt; (n + 1, fact * (n + 1))) \/\/ \u043d\u0438\u043a\u0430\u043a\u0438\u0445 None!   )(0 -&gt; 1)<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043b\u0435\u043d\u0438\u0432\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u0430\u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u0430\u043b\u0433\u0435\u0431\u0440\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0434\u043b\u044f \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2013 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0442\u0438\u043f <img decoding=\"async\" class=\"formula inline\" source=\"F[F[\\ldots\\infty\\ldots]]\" alt=\"F[F[\\ldots\\infty\\ldots]]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/83\/832\/832d9e1c3410ade40674511327f9f175.svg\" width=\"auto\" height=\"auto\"\/> \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u0435\u043d! \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 <code>[X] =&gt;&gt; (Int, X)<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <em>\u0442\u043e\u043b\u044c\u043a\u043e<\/em> \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0415\u0433\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0442\u0438\u043f\u0443: <img decoding=\"async\" class=\"formula inline\" source=\"\\mu[(Int,\\, \\_)] \\cong Nothing\" alt=\"\\mu[(Int,\\, \\_)] \\cong Nothing\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fe\/fea\/fea72321a0284607532d017551c4cc6d.svg\" width=\"auto\" height=\"auto\"\/>, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439: <img decoding=\"async\" class=\"formula inline\" source=\"\\mu[F] &lt;: \\nu[F]\" alt=\"\\mu[F] &lt;: \\nu[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/83\/83e\/83ee4a890643a585f2a615446a4b02f4.svg\" width=\"auto\" height=\"auto\"\/>.<\/p>\n<p>\u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0442\u0438\u043f), \u0434\u0435\u043b\u0430\u044e\u0449\u0443\u044e \u0438\u0445 \u043d\u0435\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438. \u0418\u0445 \u0442\u0438\u043f\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 <em>\u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u044b\u043c\u0438<\/em> \u2013 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u0430\u043b \u0431\u044b \u043e\u0442\u0432\u0435\u0442 \u043e\u0431 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438. \u041b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"fix_i[F]\" alt=\"fix_i[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/45\/45e\/45e83a59513c56c18a69d5f47d14c690.svg\" width=\"auto\" height=\"auto\"\/>, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0442\u0438\u043f <img decoding=\"async\" class=\"formula inline\" source=\"fixF_i\" alt=\"fixF_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f9\/f9c\/f9cfa2e4ccd5b920261d9e389047b760.svg\" width=\"auto\" height=\"auto\"\/> \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u00ab\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e\u00bb: <img decoding=\"async\" class=\"formula inline\" source=\"\\mu[F] &lt;: fix_i[F] &lt;: \\nu[F]\" alt=\"\\mu[F] &lt;: fix_i[F] &lt;: \\nu[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/85\/85a\/85a6339de3e200da1af89db91471d25e.svg\" width=\"auto\" height=\"auto\"\/>. \u041f\u0440\u0438\u0447\u0451\u043c, \u0432\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b <img decoding=\"async\" class=\"formula inline\" source=\"fixF_i\" alt=\"fixF_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f9\/f9c\/f9cfa2e4ccd5b920261d9e389047b760.svg\" width=\"auto\" height=\"auto\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"fixF_j\" alt=\"fixF_j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/95\/959\/95997ccfdd0b8fc1494d6b5b60ad28f1.svg\" width=\"auto\" height=\"auto\"\/> \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b, \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"fix_i[F]\" alt=\"fix_i[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/45\/45e\/45e83a59513c56c18a69d5f47d14c690.svg\" width=\"auto\" height=\"auto\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"fix_j[F]\" alt=\"fix_j[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/18\/18a\/18a4d7ac6cc4d478a5d2e8f7a46d5fa4.svg\" width=\"auto\" height=\"auto\"\/> \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438, \u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u00ab\u0431\u043e\u043b\u044c\u0448\u0435\u00bb \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439, \u043d\u043e \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u043e\u0447\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u043e\u0432 <code>Id[X] = X<\/code> \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0442\u0438\u043f <img decoding=\"async\" class=\"formula inline\" source=\"Id[Id[\\ldots\\infty\\ldots]]\" alt=\"Id[Id[\\ldots\\infty\\ldots]]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e65\/e656d58fd4929b5d2b9b76af5ef9624a.svg\" width=\"auto\" height=\"auto\"\/> \u2013 \u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 <code>Id<\/code>. \u041d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0438 \u043c\u0435\u043d\u0435\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/docs.scala-lang.org\/scala3\/reference\/new-types\/match-types.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438<\/a> \u0432 Scala 3 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 <code>Nothing<\/code>:<\/p>\n<pre><code class=\"scala\">type Semaphore[X] = X match   case Unit    =&gt; Boolean   case Boolean =&gt; Unit<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e <strong>\u0432\u0441\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0435\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b<\/strong> \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443. \u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u043c\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 <em>\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e-\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438<\/em> \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0434\u0432\u0435 \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u043e\u0431\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u00ab\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 <code>\ud835\udece[F]<\/code> \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u043a <code>fold\ud835\udece<\/code>, \u0442\u0430\u043a \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 <code>\u03bc[F]<\/code>. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u0445 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435.<\/p>\n<p>\u0418\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043c\u0435\u0436\u0434\u0443 <code>\ud835\udece[F]<\/code> \u0438 <code>\u03bc[F]<\/code> \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"scala\">def \u0442\u0443\u0434\u0430   : \ud835\udece[F] =&gt; \u03bc[F] =   fold\ud835\udece( in\u03bc) def \u043e\u0431\u0440\u0430\u0442\u043d\u043e: \u03bc[F] =&gt; \ud835\udece[F] = unfold\ud835\udece(out\u03bc)<\/code><\/pre>\n<p>\u0418 \u0432\u0441\u0451 \u0436\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u043e\u0441\u0442\u044c, \u0442\u0438\u043f\u044b <code>\ud835\udece[F]<\/code> \u0438 <code>\u03bc[F]<\/code> \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0432\u0430 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u2013 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0435\u0451 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u0430\u0440\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 StackOverflow:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/51683361\/least-fix-point-greatest-fix-point\" rel=\"noopener noreferrer nofollow\">Least fix point, greatest fix point<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/45580858\/what-is-the-difference-between-fix-mu-and-nu-in-ed-kmetts-recursion-scheme-pac\" rel=\"noopener noreferrer nofollow\">What is the difference between Fix, Mu and Nu in Ed Kmett&#8217;s recursion scheme package<\/a>;<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/homepages.inf.ed.ac.uk\/wadler\/papers\/free-rectypes\/free-rectypes.txt\" rel=\"noopener noreferrer nofollow\">Recursive types for free!<\/a> \u2013 \u0441\u0442\u0430\u0442\u044c\u044f \u043b\u044f\u043c\u0431\u0434\u0430-\u043c\u0435\u043d\u0430 \u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0412\u043e\u0434\u043b\u0435\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/chrilves.github.io\/types\/5-rectypes\/\" rel=\"noopener noreferrer nofollow\">RECURSIVE DATA TYPES<\/a> \u2013 5 \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 <a href=\"https:\/\/chrilves.github.io\/types\/\" rel=\"noopener noreferrer nofollow\">INTRODUCTION TO TYPES<\/a>;<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"rec_class_types\" id=\"rec_class_types\"><\/a><\/p>\n<h2>\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a<\/h2>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u043e \u0432\u0441\u0435 \u0438\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 <em>\u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432<\/em>:<\/p>\n<pre><code class=\"scala\">type   Fold[Fix[_[_]]] = [F[_]] =&gt; Lift[F] ?=&gt; [X] =&gt;  Algebra[F][X]  =&gt; Fix[F] =&gt;     X type Unfold[Fix[_[_]]] = [F[_]] =&gt; Lift[F] ?=&gt; [X] =&gt; Coalgebra[F][X] =&gt;     X  =&gt; Fix[F]  def    fold[Fix[_[_]]:   Fold] = summon[  Fold[Fix]] def  unfold[Fix[_[_]]: Unfold] = summon[Unfold[Fix]]<\/code><\/pre>\n<p>\u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041d\u043e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c <img decoding=\"async\" class=\"formula inline\" source=\"F[Fix[F]] \\cong Fix[F]\" alt=\"F[Fix[F]] \\cong Fix[F]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/07\/07e\/07e3fd1422151973dec611b0c0eac2fc.svg\" width=\"auto\" height=\"auto\"\/>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"scala\">type  InFix[Fix[_[_]]] =   Fold[Fix] ?=&gt; [F[_]] =&gt; Lift[F] ?=&gt;   Algebra[F][Fix[F]] type OutFix[Fix[_[_]]] = Unfold[Fix] ?=&gt; [F[_]] =&gt; Lift[F] ?=&gt; Coalgebra[F][Fix[F]]  def   inFix[Fix[_[_]]:  InFix:   Fold, F[_]: Lift]:   Algebra[F][Fix[F]] = summon[ InFix[Fix]][F] def  outFix[Fix[_[_]]: OutFix: Unfold, F[_]: Lift]: Coalgebra[F][Fix[F]] = summon[OutFix[Fix]][F]<\/code><\/pre>\n<p>\u0418 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"scala\">trait FixedPoint[Fix[_[_]]]:   def   fold[F[_]]: [X] =&gt;   Algebra[F][X] =&gt; Fix[F] =&gt;     X   def unfold[F[_]]: [X] =&gt; Coalgebra[F][X] =&gt;     X  =&gt; Fix[F]   def     in[F[_]: Lift]:    Algebra[F][Fix[F]]   def    out[F[_]: Lift]:  Coalgebra[F][Fix[F]]<\/code><\/pre>\n<p>\u043e\u0434\u043d\u0430\u043a\u043e, \u0434\u0432\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0435. \u0418\u0437 \u043f\u0430\u0440\u044b <code>(fold, in)<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0443 <code>(unfold, out)<\/code> \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442! \u0432\u044b\u0440\u0430\u0437\u0438\u043c \u044d\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"scala\">given unfoldFromFold[Fix[_[_]]: InFix: Fold]: Unfold[Fix] =   [F[_]] =&gt; (_: Lift[F]) ?=&gt; [X] =&gt; (coalg: Coalgebra[F][X]) =&gt; (x: X) =&gt;     inFix(fmap(unfoldFromFold(coalg))(coalg(x)))  given foldFromUnfold[Fix[_[_]]: OutFix: Unfold]: Fold[Fix] =   [F[_]] =&gt; (_: Lift[F]) ?=&gt; [X] =&gt; (alg: Algebra[F][X]) =&gt; (fixF: Fix[F]) =&gt;     alg(fmap(foldFromUnfold(alg))(outFix(fixF)))  given outFromIn[Fix[_[_]]:  InFix:   Fold, F[_]: Lift]: Coalgebra[F][Fix[F]] =   foldFix(fmap( inFix)) given inFromOut[Fix[_[_]]: OutFix: Unfold, F[_]: Lift]:   Algebra[F][Fix[F]] = unfoldFix(fmap(outFix))<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 <code>\u03bc<\/code>:<\/p>\n<pre><code class=\"scala\">given Fold[\u03bc] =   [F[_]] =&gt; (_: Lift[F]) ?=&gt; [X] =&gt; (alg: Algebra[F][X]) =&gt; (fixf: \u03bc[F]) =&gt;     fixf(alg)  given InFix[\u03bc] =   [F[_]] =&gt; (_: Lift[F]) ?=&gt; (f\u03bcF: F[\u03bc[F]]) =&gt; [X] =&gt; (alg: Algebra[F][X]) =&gt;     alg(fmap(foldFix(alg))(f\u03bcF))  val \u03bcfactorial10: \u03bcList[Int] = unfoldFix[\u03bc](factCoalg10)(0, 1) foldFix(stringAlgebra)(\u03bcfactorial10) \/\/ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, nil<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u00ab\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438\u00bb \u0431\u044b\u043b\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u044f\u0432\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code>unfoldFromFold<\/code>.<\/p>\n<p>\u0412 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/github.com\/precog\/matryoshka\" rel=\"noopener noreferrer nofollow\">Matryoshka<\/a> \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <code>Fold<\/code> \u0438 <code>InFix<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Recursive[Fix[_[_]]]<\/code>, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a <code>Unfold<\/code> \u0438 <code>OutFix<\/code> \u2013 \u0432 <code>Corecursive[Fix[_[_]]]<\/code>. \u0412 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u0451\u0440\u0442\u043a\u0438\/\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u041d\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u0432 \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0434\u0430\u0436\u0435 <em>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043d\u0435\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435<\/em> \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p><a class=\"anchor\" name=\"conclusion\" id=\"conclusion\"><\/a><\/p>\n<h2>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h2>\n<ul>\n<li>\n<p>\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u0447\u0451\u043c, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441\u044b (\u0442\u0440\u0435\u0439\u0442\u044b, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0442.\u043f.) \u0441 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c\u0438 \u00ab\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0435\u0431\u044f\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0438\u043b\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0443\u044e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <em>\u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445<\/em>;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 <em>\u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/em>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2013 \u044d\u0442\u043e \u0441\u0432\u0451\u0440\u0442\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u2013 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 <em>\u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em> (<a href=\"https:\/\/gist.github.com\/smarter\/2e1c564c83bae58c65b4f3f041bfb15f\" rel=\"noopener noreferrer nofollow\">GADT<\/a>). \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0435 \u043c\u044b \u043e\u0431\u043e\u0439\u0434\u0451\u043c \u0438\u0445 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/863324\/\"> https:\/\/habr.com\/ru\/articles\/863324\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"#rec_types_init\" rel=\"noopener noreferrer nofollow\">\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_fixed_point\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_algebras\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f F-\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#type_gfp\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#rec_class_types\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/a><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0414\u0440\u0443\u0433\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/article\/863304\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 1. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863324\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2. \u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/a>\u00a0(\u043c\u044b \u0437\u0434\u0435\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863334\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 3. \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863362\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 4. \u0421\u0445\u0435\u043c\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/863376\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 5. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0442\u0430\u043d<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"rec_types_init\" id=\"rec_types_init\"><\/a><\/p>\n<h2>\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u043b\u0438 \u0442\u0438\u043f\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0441\u043f\u0435\u043a\u0442, \u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u044b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b.<\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0431\u044b\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041c\u044b \u0432\u043d\u043e\u0432\u044c \u0438 \u0432\u043d\u043e\u0432\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u00ab\u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0438\u00bb \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type OptCell = [A] =&gt;&gt; [X] =&gt;&gt; Option[(A, X)] \/\/ 1 + A \u00d7 X  type List3 = [A] =&gt;&gt; OptCell[A][OptCell[A][OptCell[A][Unit]]] \/\/   List3 = 1 + A \u00d7 (1 + A \u00d7 (1 + A \u00d7 1)) \u2245 1 + A + A \u00d7 A + A \u00d7 A \u00d7 A  val lst3: List3[Int] = Some(1, Some(2, Some(3, ()))) \/\/ (1, 2, 3)<\/code><\/pre>\n<p>\u0422\u0438\u043f <code>List3<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u00ab\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a\u00bb \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u0438\u043d\u043d\u044b 0, 1, 2 \u0438 3. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>lst3<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u044b 3.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u0442\u0430\u043a\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432:<\/p>\n<pre><code class=\"scala\">def foldList3[A, B](b: B, comb: (A, B) =&gt; B) = (lst: List3[A]) =&gt;   lst match     case None =&gt; b     case Some(a: A, x) =&gt;       val acc1 = comb(a, b)       x match         case None =&gt; acc1         case Some(a, x) =&gt;           val acc2 = comb(a, acc1)           x match             case None =&gt; acc2             case Some(a, _) =&gt; comb(a, acc2)  val foldToString = foldList3(\"foldList3: \", (i: Int, s: String) =&gt; s + i + \" \") foldToString(lst3) \/\/ \"foldList3: 1 2 3\"<\/code><\/pre>\n<p>\u0411\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0435 (\u043d\u0443, \u043f\u043e\u0447\u0442\u0438) \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u0442\u0435\u043b\u0435 <code>foldList3<\/code>, \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>List3<\/code>, \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445 <code>OptCell<\/code>. \u041d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u2013 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0431\u044b \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0438\u0445 \u0434\u043b\u0438\u043d\u0443. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <code>List_\u221e<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0435\u043d \u0441\u0443\u043c\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0434\u043b\u0438\u043d. \u0412\u043e\u0442 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">case class List_\u221e[A](cell: OptCell[A][List_\u221e[A]])<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>List_\u221e<\/code> \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u0441\u0432\u0451\u0440\u0442\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439:<\/p>\n<pre><code class=\"scala\">def foldList_\u221e[A, B](lst: List_\u221e[A], b: B, comb: (A, B) =&gt; B): B =   lst.cell match     case None             =&gt; b     case Some(head, tail) =&gt; foldList_\u221e(tail, comb(head, b), comb)     \/\/                         \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 - \u0432\u044b\u0437\u043e\u0432 \u0441\u0435\u0431\u044f \u0436\u0435 val lst4 = List_\u221e(Some(1, List_\u221e(Some(2, List_\u221e(Some(3, List_\u221e(Some(4, List_\u221e(None)))))))))  foldList_\u221e(lst4, \"foldList_\u221e: \", (i: Int, s: String) =&gt; s + i + \" \") \/\/ foldList_\u221e: 1 2 3 4<\/code><\/pre>\n<p>\u0418, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438\u0437 \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 <strong>\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/strong>:<\/p>\n<pre><code class=\"scala\">type FoldIterState[A, B] = (List_\u221e[A], B, (A, B) =&gt; B) type FoldFunc[A, B] = FoldIterState[A, B] =&gt; B  def foldListBase[A, B]: FoldFunc[A, B] =&gt; FoldFunc[A, B] =   self =&gt; (lst, b, comb) =&gt;   lst.cell match     case None             =&gt; b     case Some(head, tail) =&gt; self(tail, comb(head, b), comb)  def foldList[A, B] = fix(foldListBase[A, B])<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <em>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u043e\u0432<\/em>. \u042d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u0438\u0437 \u0441\u0440\u0435\u0434\u044b \u0445\u0430\u0441\u043a\u0435\u043b\u0438\u0441\u0442\u043e\u0432, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u0438\u0440\u043e\u0434\u0443 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0441\u043c., <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#type_constructors\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e<\/a>), \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0434\u043d\u0438 \u0442\u0438\u043f\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043d\u043e\u0432\u044b\u0435. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/habr.com\/ru\/articles\/807467\/#type_kind\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432<\/a>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435:<\/p>\n<p>\u0433\u0434\u0435  \u2013 \u044d\u0442\u043e \u0432\u0438\u0434 <em>\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/em> \u0442\u0438\u043f\u0430. \u0422\u0438\u043f <code>List_\u221e<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432 \u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0434\u043b\u044f <code>OptCell<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 -\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Scala \u2013 -\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/System_F#System_F%CF%89\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430 F\u03c9<\/a>) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432!<\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f\u00bb \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a \u043d\u0438\u043c \u0442\u0435 \u0436\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0430\u0441\u0441 <code>List_\u221e<\/code> \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0436\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0447\u0435\u0440\u0435\u0437 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">type List_\u221e = [A] =&gt;&gt; OptCell[A][List_\u221e[A]] \/\/ \u041e\u0428\u0418\u0411\u041a\u0410 \u041a\u041e\u041c\u041f\u0418\u041b\u042f\u0426\u0418\u0418 \/\/ illegal cyclic type reference: alias ... of type Lst_\u221e refers back to the type itself <\/code><\/pre>\n<p>\u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u0432 Scala 3 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0430\u0445 \u0442\u0438\u043f\u043e\u0432, \u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u043b\u0435\u043f\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439\u2026<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0435\u0449\u0451 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 Scala \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"type_fixed_point\" id=\"type_fixed_point\"><\/a><\/p>\n<h2>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u043e\u0432<\/h2>\n<p>\u041f\u0440\u044f\u043c\u044b\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 <code>fix: (A =&gt; A) =&gt; A<\/code>, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"scala\">case class Fix[F[_]](val: F[Fix[F]]) \/\/ Fix: (\u22c6 \u2192 \u22c6) \u2192 \u22c6<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Fix<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <em>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e<\/em> \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0435\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 <code>F[_]<\/code> \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435: <code>F[F[F[\u2026\u221e\u2026]]]<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Fix<\/code>:<\/p>\n<pre><code class=\"scala\">type List[A] = Fix[OptCell[A]] val list: List[Int] = Fix(Some(1, Fix(Some(2, Fix(Some(3, Fix(None))))))) \/\/ (1, 2, 3)<\/code><\/pre>\n<p>\u0418, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0443 <code>fixf<\/code>, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code class=\"scala\">case class FixF[RecBase[_[_], _], A](v: RecBase[[X] =&gt;&gt; FixF[RecBase, X], A])<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u2013 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>FixF<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0435\u043c\u0443, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0435 <code>Fix<\/code>. \u041d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>FixF<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0438\u0431\u0447\u0435 \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438\u00bb:<\/p>\n<pre><code class=\"scala\">type TreeBase = [Self[_], A] =&gt;&gt; Option[(A, Self[A], Self[A])] type Tree     = [A]          =&gt;&gt; FixF[TreeBase, A]  val \u2205   : Tree[Nothing] = FixF(None) val tree: Tree[Int]     = FixF(Some(4, \u2205, FixF(Some(2, \u2205, \u2205)))) \/\/    4 \/\/                                                                   \/  \\ \/\/                                                                  \u2205    2 \/\/                                                                      \/  \\ \/\/                                                                     \u2205    \u2205<\/code><\/pre>\n<p>\u0412\u0438\u0434\u044b \u0442\u0438\u043f\u043e\u0432 <code>TreeBase<\/code> \u0438 <code>FixF<\/code> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 Scala, \u043d\u043e \u0443 \u043d\u0438\u0445 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f <strong>\u0442\u0435 \u0436\u0435 \u0447\u0435\u0440\u0442\u044b<\/strong>, \u0447\u0442\u043e \u0438 \u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e <code>FixF<\/code> \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438:<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u0432\u0435\u0440\u0445\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u043d\u0438\u0436\u043d\u0438\u0435 \u0437\u043d\u0430\u043a\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, Scala \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0442\u0438\u043f\u0430\u043c\u0438-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <code>TreeBase<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438 \u0443 <code>Self<\/code>, \u0438 \u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<code>FixF<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0437\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u043a <code>+<\/code>, \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435:<\/p>\n<pre><code class=\"scala\">case class FixContra[RecBase[_[-_], -_], -A](v: RecBase[[X] =&gt;&gt; FixContra[RecBase, X], A]) type WtfBase = [Self[-_], A] =&gt;&gt; Option[Self[Self[A]]] =&gt; String type Wtf[A]  = FixContra[WtfBase, A] \/\/ \u2191\u2191\u2191\u2191-\u2191\u2191\u2191\u2191 - \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438))  val wtf: Wtf[Int] = opt =&gt; ??? \/\/                  \u2191\u2191\u2191 - \u043e\u0448\u0438\u0431\u043a\u0430! \u0442\u0438\u043f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c!!!<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <em>\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c<\/em> \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0442\u0435\u0440\u043c\u0430 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f). \u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f<\/em>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <em>\u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b<\/em>. \u0418\u0445 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <em>\u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435<\/em>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0433\u043e\u0432 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/Iltotore\/iron\" rel=\"noopener noreferrer nofollow\">iron<\/a>, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 (+\u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435) \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438. \u0412\u043e\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"scala\">type ContStr[+A] = (A =&gt; String) =&gt; String type ContRec = Fix[ContStr] val  contRec: ContRec = Fix((f: Fix[ContStr] =&gt; String) =&gt; ???) \/\/                     \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c? \u2191\u2191\u2191<\/code><\/pre>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f <code>ContStr<\/code> \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439, \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0422\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>f<\/code> \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0432\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>f: Fix[ContStr] =&gt; String<\/code> \u043e\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e <em>\u0447\u0435\u0441\u0442\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e! \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 <em>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439<\/em> \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0442\u0435\u0445 \u0436\u0435 <code>Fix<\/code>, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>contRec<\/code>. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u00ab\u0447\u0438\u0442\u0435\u0440\u0441\u043a\u0438\u0435\u00bb \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u0432\u0440\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>toString<\/code>, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0433\u043e \u043a \u0442\u0435\u0440\u043c\u0430\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/p>\n<blockquote>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <u>\u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435<\/u> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 (\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438).<\/p>\n<\/blockquote>\n<p><a class=\"anchor\" name=\"type_algebras\" id=\"type_algebras\"><\/a><\/p>\n<h2>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f F-\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/h2>\n<p>\u041d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 <code>I = Fix[F]<\/code> \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/758542\/#algebra\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u0442\u0438\u043f\u043e\u0432<\/a> . \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 <code>I<\/code> \u0438 <code>F[I]<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u00ab\u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u00bb, \u043f\u0440\u0438\u0447\u0451\u043c \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Fix<\/code> \u0442\u0430\u043a\u043e\u0439 \u0438\u0437\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0440 <code>unfix<\/code>, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0412\u044b\u043f\u0438\u0448\u0435\u043c \u0442\u0438\u043f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"scala\">type Algebra[F[_]] = [X] =&gt;&gt; X =&gt; F[X] \/\/ Algebra: (\u22c6 \u2192 \u22c6) \u2192 (\u22c6 \u2192 \u22c6)<\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u00ab<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430<\/em>\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0438\u0437-\u0437\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0439. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 <code>Algebra[F]<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 <code>F[_]<\/code> \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>X<\/code> \u0432 \u043d\u0435\u0433\u043e \u0436\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0438\u043f\u0430  \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u00ab\u0430\u0440\u043d\u043e\u0441\u0442\u0438\u00bb:<\/p>\n<p>\u00ab\u041a\u043e\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439\u00bb \u0436\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u044b \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<p>\u041d\u043e \u0432 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435 \u0441\u0430\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <code>Algebra[F]<\/code>, \u0430 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>X<\/code>, \u043e\u0431\u043e\u0433\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u044d\u0442\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 <code>(X, Algebra[F][X])<\/code>. \u042d\u0442\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0434 <em>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 F-\u0430\u043b\u0433\u0435\u0431\u0440\u043e\u0439<\/em> \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"scala\">type \u03bc[F[_]] = [X] =&gt; Algebra[F][X] =&gt; X \/\/ \u03bc[F[_]] = Algebra[F] ~&gt; Id<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043b\u0430\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-443088","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443088","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=443088"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443088\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=443088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=443088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=443088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}