/Programs/HabrFormat/formated_article.html

https://github.com/graninas/Haskell-Algorithms · HTML · 337 lines · 225 code · 112 blank · 0 comment · 0 complexity · 83016777068a403d1870999d77304581 MD5 · raw file

  1. Åùå Îäíî Ðóêîâîäñòâî ïî Ìîíàäàì (÷àñòü 4: Ìîíàäà Maybe)
  2. Mike Vanier
  3. http://mvanier.livejournal.com
  4. Ïåðåâîä: Ãðàíèí À. Ñ.
  5. graninas@gmail.com
  6.  ïðåäûäóùèõ ñòàòüÿõ ýòîé ñåðèè ìû èçó÷àëè êîíöåïòóàëüíûé áàçèñ ìîíàä, íî îáñóæäåíèå íàøå áûëî ñëèøêîì àáñòðàêòíûì. Òåïåðü, êîãäà âû, ÿ íàäåþñü, ïîíÿëè, ÷òî ìîíàäû òàêîå è äëÿ ÷åãî îíè íóæíû, ïðèøëî âðåìÿ äëÿ äåòàëüíîãî ðàññìîòðåíèÿ ñïåöèôè÷åñêèõ ìîíàä. Ýòî çíà÷èò, ÷òî ìû îïðåäåëèì êîððåêòíûå âîïëîùåíèÿ êëàññà òèïîâ <font color=blue>Monad</font> äëÿ ìíîæåñòâà ðàçëè÷íûõ ïîíÿòèé âû÷èñëåíèé, êîòîðûå ìû óâèäåëè ðàíüøå. Ìû èñïîëüçóåì íàøè çíàíèÿ, ÷òîáû ïîëó÷èòü ìîíàäè÷åñêóþ êîìïîçèöèþ â êàæäîì êîíêðåòíîì ñëó÷àå ÷åðåç ìîíàäè÷åñêîå ïðèìåíåíèå (îïåðàòîð <font color=blue>>>=</font>), è ñ ïîìîùüþ ìîíàäíûõ çàêîíîâ ìû âûâåäåì îïðåäåëåíèå <font color=blue>return</font>.
  7. Ìîíàäà <font color=blue>Maybe</font>
  8. Ìîíàäó <font color=blue>Maybe</font> îáû÷íî ïåðâîé ïðåäñòàâëÿþò â ðóêîâîäñòâàõ ïî Haskell, ïîòîìó ÷òî îíà î÷åíü ïðîñòà â èñïîëüçîâàíèè, ðåàëèçàöèè è ïîíèìàíèè. Äëÿ íà÷àëà âçãëÿíåì íà îïðåäåëåíèå òèïà äàííûõ <font color=blue>Maybe</font>:
  9. <blockquote><font color="#06c">data</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;a&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;<font color="#339933">|</font>&nbsp;Just&nbsp;a</blockquote>
  10. Çäåñü óêàçàíî, ÷òî <font color=blue>Maybe</font> - ýòî êîíñòðóêòîð òèïà, â êîòîðûé ïîìåùàåòñÿ îïðåäåëåííûé òèï <font color=blue>a</font>, ÷òîáû ïîëó÷èòü (êîíêðåòíûé) òèï äàííûõ. Åùå ãîâîðÿò, ÷òî <font color=blue>Maybe</font> - ýòî "ïîëèìîðôíûé" òèï äàííûõ, ñìûñë òîò æå. Òàê, åñëè áû <font color=blue>a</font> áûë <font color=blue>Int</font>, ìû áû ïîëó÷èëè:
  11. <blockquote><font color="#06c">data</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;<font color="#339933">|</font>&nbsp;Just&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font></blockquote>
  12. Òîëüêî âîò íàì íå íóæíî ýòî ïèñàòü íåïîñðåäñòâåííî, òàê êàê àáñòðàêòíîå îïðåäåëåíèå âûøå ïîäõîäèò êî âñåì òèïàì.
  13. Çíà÷åíèå òèïà <font color=blue>Maybe a</font> ìîæåò ëèáî áûòü, ëèáî îòñóòñòâîâàòü. Åñëè çíà÷åíèå ðàâíî <font color=blue>Nothing</font> ("Íè÷òî"), òî åãî "êàê áû è íåò", à åñëè îíî ðàâíî <font color=blue>Just x</font> äëÿ íåêîòîðîãî çíà÷åíèÿ <font color=blue>x</font>, òî ýòî "ïðîñòî" çíà÷åíèå <font color=blue>x</font>. Ìîæíî äóìàòü îá ýòîì êàê î êîíòåéíåðå, â êîòîðîì ëèáî 0 ýëåìåíòîâ, ëèáî îí îäèí. (Âñïîìíèòå: ÿ êîãäà-òî ãîâîðèë, ÷òî ìîíàäè÷åñêèå çíà÷åíèÿ èíîãäà îøèáî÷íî ïðåäñòàâëÿþòñÿ â âèäå êîíòåéíåðîâ. Ýòî òîò ñàìûé ñëó÷àé.)
  14. Ïîëèìîðôíûé òèï <font color=blue>Maybe</font> ïîëåçåí òåì, ÷òî ìû ìîæåì èñïîëüçîâàòü åãî êàê ìîäåëü "ðàñøèðåííîé ôóíêöèè", êîòîðàÿ ëèáî ïðîèçâîäèò ÷òî-òî êàê âûõîäíîå çíà÷åíèå, ëèáî òåðïèò â ýòîì êðàõ è íå ìîæåò âåðíóòü íèêàêîå çíà÷åíèå. (Òî åñòü, òàêàÿ ôóíêöèÿ ìîæåò ïðîâàëèòüñÿ.) Ýòî çàïèñûâàåòñÿ òàê:
  15. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;b</blockquote>
  16. Ôóíêöèÿ <font color=blue>f</font> áåðåò çíà÷åíèå òèïà <font color=blue>a</font> è ëèáî âîçâðàùàåò <font color=blue>Nothing</font> (ïðèçíàê íåóäà÷è), ëèáî çíà÷åíèå <font color=blue>Just x</font>, ãäå ó <font color=blue>x</font> òèï <font color=blue>b</font>. Ôóíêöèè âðîäå <font color=blue>f</font> áóäóò ðàáîòàòü â ìîíàäå <font color=blue>Maybe</font>, è êîìïîçèöèÿ äâóõ òàêèõ ôóíêöèé âûãëÿäèò ñëåäóþùèì îáðàçîì:
  17. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;b&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïðåäïîëàãàåì,&nbsp;÷òî&nbsp;f&nbsp;ãäå-òî&nbsp;îïðåäåëåíà</font><br/>
  18. g&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;b&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;c&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïðåäïîëàãàåì,&nbsp;÷òî&nbsp;g&nbsp;ãäå-òî&nbsp;îïðåäåëåíà</font><br/>
  19. &nbsp;<br/>
  20. h&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;c&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ìîíàäè÷åñêàÿ&nbsp;êîìïîçèöèÿ&nbsp;f&nbsp;è&nbsp;g</font><br/>
  21. h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;âñïîìíèì:&nbsp;&gt;=&gt;&nbsp;-&nbsp;ýòî&nbsp;îïåðàòîð&nbsp;ìîíàäè÷åñêîé&nbsp;êîìïîçèöèè</font></blockquote>
  22. Ìû ãîâîðèëè, ÷òî âñå ìîíàäû äîëæíû áûòü êîíñòðóêòîðàìè òèïîâ. <font color=blue>Maybe</font> - ýòî êîíñòðóêòîð òèïà, òàê ÷òî òóò âñå õîðîøî. Íî äëÿ òîãî ÷òîáû <font color=blue>Maybe</font> ñòàë ìîíàäîé, íàì íóæíî ñîçäàòü ýêçåìïëÿð êëàññà òèïîâ <font color=blue>Monad</font>, à ýòî çíà÷èò, ÷òî ìû äîëæíû çàïîëíèòü ñëåäóþùåå îïðåäåëåíèå:
  23. <blockquote><font color="#06c">instance</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Monad">Monad</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color="#06c">where</font><br/>
  24. &nbsp;&nbsp;<font>&#40;</font><font color="#339933">&gt;&gt;=</font><font>&#41;</font>&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<i><font color="#5d478b">{-&nbsp;îïðåäåëåíèå&nbsp;&gt;&gt;=&nbsp;äëÿ&nbsp;Maybe&nbsp;-}</font></i><br/>
  25. &nbsp;&nbsp;<font>return</font>&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<i><font color="#5d478b">{-&nbsp;îïðåäåëåíèå&nbsp;return&nbsp;äëÿ&nbsp;Maybe&nbsp;-}</font></i></blockquote>
  26. Êàê ìû ìîæåì çàäàòü <font color=blue>(>>=)</font> è <font color=blue>return</font> äëÿ <font color=blue>Maybe</font>?
  27. Ñíà÷àëà íàïèøåì êàðêàñ îïðåäåëåíèÿ äëÿ <font color=blue>>>=</font>, ïîêðûâàþùèé äâà âîçìîæíûõ ñëó÷àÿ ëåâîãî îïåðàíäà òèïà <font color=blue>Maybe a</font>:
  28. <blockquote>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<i><font color="#5d478b">{-&nbsp;íóæíî&nbsp;äîïèñàòü&nbsp;-}</font></i><br/>
  29. Just&nbsp;x&nbsp;&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<i><font color="#5d478b">{-&nbsp;íóæíî&nbsp;äîïèñàòü&nbsp;-}</font></i></blockquote>
  30. ãäå <font color=blue>x</font> èìååò òèï <font color=blue>a</font>. Ëåâóþ ÷àñòü îïðåäåëåíèÿ ìîæíî íàïèñàòü è ïî-äðóãîìó:
  31. <blockquote><font>&#40;</font><font color="#339933">&gt;&gt;=</font><font>&#41;</font>&nbsp;Nothing&nbsp;&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<i><font color="#5d478b">{-&nbsp;íóæíî&nbsp;äîïèñàòü&nbsp;-}</font></i><br/>
  32. <font>&#40;</font><font color="#339933">&gt;&gt;=</font><font>&#41;</font>&nbsp;<font>&#40;</font>Just&nbsp;x<font>&#41;</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<i><font color="#5d478b">{-&nbsp;íóæíî&nbsp;äîïèñàòü&nbsp;-}</font></i></blockquote>
  33. Íî ëó÷øå âñå-òàêè, åñëè îïåðàòîð <font color=blue>(>>=)</font> çàäàí êàê îïåðàòîð, à íå êàê ôóíêöèÿ, è Haskell íàì ýòî ïîçâîëÿåò.
  34. Äëÿ çàâåðøåíèÿ ýòîãî îïðåäåëåíèÿ ïîäóìàåì, ÷òî ìû õîòèì ïîëó÷èòü îò ìîíàäè÷åñêîé êîìïîçèöèè â ìîíàäå <font color=blue>Maybe</font>. Äàâàéòå âîçüìåì íàø ïðèìåð ñ ôóíêöèÿìè <font color=blue>f</font> è <font color=blue>g</font>, ìîíàäè÷åñêè èõ ñêîìïîíóåì è ïîëó÷èì ôóíêöèþ <font color=blue>h</font>:
  35. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;b<br/>
  36. g&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;b&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;c<br/>
  37. h&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;c<br/>
  38. h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g</blockquote>
  39. Åñëè ìû ïåðåäàäèì àðãóìåíò â ôóíêöèþ <font color=blue>f</font>, è îíà âåðíåò <font color=blue>Nothing</font> (òî åñòü, ïîòåðïèò íåóäà÷ó), òî ÷òî äîëæíà âåðíóòü ôóíêöèÿ <font color=blue>h</font>?
  40. <blockquote>f&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing<br/>
  41. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#40;</font>f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g<font>&#41;</font>&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#339933">???</font></blockquote>
  42. Êàæåòñÿ î÷åâèäíûì, ÷òî åñëè <font color=blue>f x</font> âåðíåò <font color=blue>Nothing</font>, òî è <font color=blue>h</font> òîæå äîëæíà âåðíóòü <font color=blue>Nothing</font>, ïîñêîëüêó åñëè ÷àñòü âûðàæåíèÿ (ôóíêöèÿ <font color=blue>f</font>) íå ñìîãëà âåðíóòü ðåçóëüòàò, òî è âñå âûðàæåíèå (ôóíêöèÿ <font color=blue>h</font>) íå ñìîæåò åãî âåðíóòü. Åäèíñòâåííûé âàðèàíò, êîãäà <font color=blue>h</font> âîçâðàùàåò çíà÷åíèå, ýòî êîãäà <font color=blue>f</font> âåðíåò ðåçóëüòàò (íàçîâåì åãî <font color=blue>y</font>), îí áóäåò ïåðåäàí ôóíêöèè <font color=blue>g</font>, è <font color=blue>g y</font> - òîæå áóäåò êîððåêòíûé ðåçóëüòàò. Åñëè ïðîâàëèòñÿ <font color=blue>f</font> èëè <font color=blue>g</font>, òî è <font color=blue>h</font> çàâåðøèòñÿ íåóäà÷åé, òî åñòü, âû÷èñëåíèåì <font color=blue>h x</font> áóäåò <font color=blue>Nothing</font>.
  43. Èìåÿ ýòî â âèäó, èç íàøåãî îïðåäåëåíèÿ <font color=blue>h</font> ïîëó÷èì:
  44. <blockquote>h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g<br/>
  45. h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font>&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ýêâèâàëåíò&nbsp;(èç&nbsp;îïðåäåëåíèÿ&nbsp;&gt;=&gt;)</font><br/>
  46. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ýêâèâàëåíò</font><br/>
  47. <font color="#5d478b">--&nbsp;ïðåäïîëîæèì,&nbsp;÷òî&nbsp;f&nbsp;x&nbsp;==&nbsp;Nothing</font><br/>
  48. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#40;</font>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><br/>
  49. &nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing<br/>
  50. <font color="#5d478b">--&nbsp;òàêèì&nbsp;îáðàçîì:</font><br/>
  51. Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing</blockquote>
  52. Òåïåðü ìû çíàåì, êàê îïåðàòîð <font color=blue>(>>=)</font> ðåàãèðóåò íà àðãóìåíò <font color=blue>Nothing</font>, - îí ïðîñòî âîçâðàùàåò òîò æå <font color=blue>Nothing</font>:
  53. <blockquote>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Nothing<br/>
  54. Just&nbsp;x&nbsp;&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<i><font color="#5d478b">{-&nbsp;íóæíî&nbsp;äîïèñàòü&nbsp;-}</font></i></blockquote>
  55. Îáðàòèòå âíèìàíèå, ÿ çäåñü çàìåíèë <font color=blue>g</font> íà <font color=blue>f</font>, è ýòî êîððåêòíî, âåäü èìåíà ôóíêöèé íå âàæíû. Íà ïðàêòèêå ìû âîîáùå èçáàâëÿåìñÿ îò èìåí ôóíêöèé, åñëè ýòî âîçìîæíî, è çàìåíÿåì èõ ñïåöèàëüíûì îïåðàòîðîì <font color=blue>_</font> (íèæíåå ïîä÷åðêèâàíèå), âîò òàê:
  56. <blockquote>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font color="#339933">_</font>&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Nothing</blockquote>
  57. Ñî âòîðûì óðàâíåíèåì ýòîãî ñäåëàòü íåëüçÿ, ïîòîìó ÷òî ôóíêöèþ <font color=blue>f</font> ìû åùå áóäåì èñïîëüçîâàòü â îïðåäåëåíèè.
  58. Òåïåðü äàâàéòå ïîäîéäåì ñ äðóãîé ñòîðîíû. Åñëè <font color=blue>f x</font> <i>íå</i> ïðîâàëèòñÿ, ðåçóëüòàòîì áóäåò çíà÷åíèå <font color=blue>Just y</font> äëÿ íåêîòîðîãî <font color=blue>y</font>. Íàì íóæíî "ðàñïàêîâàòü" çíà÷åíèå <font color=blue>y</font> èç <font color=blue>Just y</font>, êîòîðîå ìû áû ïîòîì ïåðåäàëè ôóíêöèè <font color=blue>g</font>, è <font color=blue>g y</font> - ýòî ðåçóëüòàò âñåé ôóíêöèè <font color=blue>h</font>:
  59. <blockquote>h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g<br/>
  60. h&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font>&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ýêâèâàëåíò&nbsp;(èç&nbsp;îïðåäåëåíèÿ&nbsp;&gt;=&gt;)</font><br/>
  61. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ýêâèâàëåíò</font><br/>
  62. <font color="#5d478b">--&nbsp;ïðåäïîëîæèì,&nbsp;÷òî&nbsp;f&nbsp;x&nbsp;==&nbsp;Just&nbsp;y&nbsp;</font><br/>
  63. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#40;</font>Just&nbsp;y&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><br/>
  64. &nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;g&nbsp;y</blockquote>
  65. ×òî äàåò íàì âòîðóþ ÷àñòü îïðåäåëåíèÿ:
  66. <blockquote>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Nothing<br/>
  67. Just&nbsp;x&nbsp;&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;f&nbsp;x</blockquote>
  68. Çàìåòüòå, ÷òî ÿ çàìåíèë <font color=blue>y</font> íà <font color=blue>x</font> è <font color=blue>g</font> íà <font color=blue>f</font>. Îïÿòü æå, èìåíà ïåðåìåííûõ è ôóíêöèé íå èìåþò çíà÷åíèÿ äî òåõ ïîð, ïîêà âû ïîñëåäîâàòåëüíû.
  69. Íà ýòîì çàâåðøàåòñÿ îïðåäåëåíèå îïåðàòîðà <font color=blue>>>=</font> äëÿ ìîíàäû <font color=blue>Maybe</font>. Òåïåðü íàì íóæíî ïîëó÷èòü <font color=blue>return</font> äëÿ ýòîé ìîíàäû:
  70. <blockquote><font>return</font>&nbsp;x&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font color="#339933">???</font></blockquote>
  71. äëÿ ëþáîãî çíà÷åíèÿ <font color=blue>x</font>. Êàêèå ó íàñ åñòü âàðèàíòû? Ìû ìîãëè áû ïðîñòî ñêàçàòü, ÷òî
  72. <blockquote><font>return</font>&nbsp;x&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Nothing</blockquote>
  73. äëÿ ëþáîãî <font color=blue>x</font>. Îäíàêî ìû áû íàðóøèëè ìîíàäíûå çàêîíû, åñëè áû òàê ñäåëàëè:
  74. <blockquote><font>return</font>&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#339933">==</font>&nbsp;&nbsp;f&nbsp;x<br/>
  75. Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;&nbsp;f&nbsp;&nbsp;<font color="#339933">==</font>&nbsp;&nbsp;f&nbsp;x<br/>
  76. Nothing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#339933">==</font>&nbsp;&nbsp;f&nbsp;x&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ÍÅÂÅÐÍÎ!</font></blockquote>
  77. Ïðåäïîëàãàÿ, ÷òî ïî êðàéíåé ìåðå <i>íåêîòîðûå</i> <font color=blue>f x</font> íå <font color=blue>Nothing</font> (íàïðèìåð, ðàññìîòðèì ìîíàäè÷åñêóþ ôóíêöèþ <font color=blue>f x</font> = <font color=blue>Just x</font>), ïîëó÷èì îøèáêó. Åñòü è äðóãîé âàðèàíò:
  78. <blockquote><font>return</font>&nbsp;x&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Just&nbsp;x</blockquote>
  79. è îí óäîâëåòâîðÿåò ìîíàäíûì çàêîíàì:
  80. <blockquote><font>return</font>&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f<br/>
  81. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#40;</font>Just&nbsp;x<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;return&nbsp;äëÿ&nbsp;ìîíàäû&nbsp;Maybe</font><br/>
  82. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=&nbsp;äëÿ&nbsp;ìîíàäû&nbsp;Maybe</font><br/>
  83. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;âûïîëíåíèå&nbsp;ïåðâîãî&nbsp;ìîíàäíîãî&nbsp;çàêîíà</font><br/>
  84. &nbsp;<br/>
  85. Just&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>return</font><br/>
  86. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>return</font>&nbsp;x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=&nbsp;äëÿ&nbsp;ìîíàäû&nbsp;Maybe</font><br/>
  87. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Just&nbsp;x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;return&nbsp;äëÿ&nbsp;ìîíàäû&nbsp;Maybe</font><br/>
  88. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;âûïîëíåíèå&nbsp;âòîðîãî&nbsp;ìîíàäíîãî&nbsp;çàêîíà</font><br/>
  89. &nbsp;<br/>
  90. Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>return</font><br/>
  91. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=&nbsp;äëÿ&nbsp;ìîíàäû&nbsp;Maybe</font><br/>
  92. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;âûïîëíåíèå&nbsp;âòîðîãî&nbsp;ìîíàäíîãî&nbsp;çàêîíà</font></blockquote>
  93. Ðàç çàêîíû ñîáëþäàþòñÿ, ýòîò âàðèàíò è âîçüìåì. Ïîëíîå îïðåäåëåíèå ìîíàäû <font color=blue>Maybe</font> âûãëÿäèò òàê:
  94. <blockquote><font color="#06c">instance</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Monad">Monad</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color="#06c">where</font><br/>
  95. &nbsp;&nbsp;<font>return</font>&nbsp;x&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Just&nbsp;x<br/>
  96. &nbsp;<br/>
  97. &nbsp;&nbsp;Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;Nothing<br/>
  98. &nbsp;&nbsp;Just&nbsp;x&nbsp;&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;f&nbsp;x</blockquote>
  99. Âàó! Ìû òîëüêî ÷òî ñîçäàëè íàøó ïåðâóþ ìîíàäó!
  100. Ïðîñòî ÷òîáû îáåçîïàñèòü ñåáÿ, ïðîâåðèì, ÷òî îíà óäîâëåòâîðÿåò òðåòüåìó ìîíàäíîìó çàêîíó, êîòîðûé ãëàñèò:
  101. <blockquote><font>&#40;</font>mv&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;<font color="#339933">==</font>&nbsp;&nbsp;&nbsp;&nbsp;mv&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><font>&#41;</font></blockquote>
  102. Ñíà÷àëà ïðîâåðèì çàêîí äëÿ ñëó÷àÿ, êîãäà mv = Nothing:
  103. <blockquote><font>&#40;</font>Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ñ&nbsp;ëåâîé&nbsp;ñòîðîíû</font><br/>
  104. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  105. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  106. &nbsp;<br/>
  107. Nothing&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><font>&#41;</font>&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ñ&nbsp;ïðàâîé&nbsp;ñòîðîíû</font><br/>
  108. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nothing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font></blockquote>
  109. Õîðîøî, ïðîâåðêà ïðîøëà óñïåøíî. Òåïåðü ïîñìîòðèì, ðàáîòàåò ëè îí äëÿ <font color=blue>mv = Just v</font>, ãäå <font color=blue>v</font> - íåêîòîðîå çíà÷åíèå:
  110. <blockquote><font>&#40;</font><font>&#40;</font>Just&nbsp;v<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ñ&nbsp;ëåâîé&nbsp;ñòîðîíû</font><br/>
  111. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;v&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  112. &nbsp;<br/>
  113. <font>&#40;</font>Just&nbsp;v<font>&#41;</font>&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><font>&#41;</font>&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ñ&nbsp;ïðàâîé&nbsp;ñòîðîíû</font><br/>
  114. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#40;</font>f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g<font>&#41;</font><font>&#41;</font>&nbsp;v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  115. &nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;v&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;íîðìàëüíîå&nbsp;ïðèìåíåíèå&nbsp;ôóíêöèè&nbsp;(áåòà-ðåäóêöèÿ)</font></blockquote>
  116. È òîæå óñïåøíî. Çíà÷èò, çàêîí âûïîëíÿåòñÿ! Ýòî <i>äåéñòâèòåëüíî</i> ïðàâèëüíîå îïðåäåëåíèå ìîíàäû <font color=blue>Maybe</font>! È ïóáëèêà ñõîäèò ñ óìà!
  117.  ÷åì ñìûñë âñåãî ýòîãî? Ýòî çíà÷èò, ÷òî òåïåðü ìû ëåãêî ìîæåì ñîåäèíèòü êó÷ó ìîíàäè÷åñêèõ ôóíêöèé ìîíàäû <font color=blue>Maybe</font>. Âû, âîçìîæíî, çàäàåòåñü âîïðîñîì, ïî÷åìó ýòî âàæíî? Ñîâñåì íåòðóäíî ïðåäñòàâèòü ñåáå ìíîãî ìîíàäè÷åñêèõ ôóíêöèé â ìîíàäå <font color=blue>Maybe</font>, òî åñòü, òàêèõ, êîòîðûå ìîãóò ïðîâàëèòüñÿ. Ñêàæåì, ïóñòü ó íèõ áóäåò òèï <font color=blue>Int -> Maybe Int</font>. Âîò òðè ïîäîáíûõ ôóíêöèè:
  118. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><br/>
  119. f&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#06c">if</font>&nbsp;x&nbsp;`<font>mod</font>`&nbsp;<font color=red>2</font>&nbsp;<font color="#339933">==</font>&nbsp;<font color=red>0</font>&nbsp;<font color="#06c">then</font>&nbsp;Nothing&nbsp;<font color="#06c">else</font>&nbsp;Just&nbsp;<font>&#40;</font><font color=red>2</font>&nbsp;<font color="#339933">*</font>&nbsp;x<font>&#41;</font><br/>
  120. &nbsp;<br/>
  121. g&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><br/>
  122. g&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#06c">if</font>&nbsp;x&nbsp;`<font>mod</font>`&nbsp;<font color=red>3</font>&nbsp;<font color="#339933">==</font>&nbsp;<font color=red>0</font>&nbsp;<font color="#06c">then</font>&nbsp;Nothing&nbsp;<font color="#06c">else</font>&nbsp;Just&nbsp;<font>&#40;</font><font color=red>3</font>&nbsp;<font color="#339933">*</font>&nbsp;x<font>&#41;</font><br/>
  123. &nbsp;<br/>
  124. h&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><br/>
  125. h&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#06c">if</font>&nbsp;x&nbsp;`<font>mod</font>`&nbsp;<font color=red>5</font>&nbsp;<font color="#339933">==</font>&nbsp;<font color=red>0</font>&nbsp;<font color="#06c">then</font>&nbsp;Nothing&nbsp;<font color="#06c">else</font>&nbsp;Just&nbsp;<font>&#40;</font><font color=red>5</font>&nbsp;<font color="#339933">*</font>&nbsp;x<font>&#41;</font></blockquote>
  126. Íàì áû õîòåëîñü ñîåäèíèòü èõ â îäíó ôóíêöèþ, êîòîðàÿ åñòü ðåçóëüòàò ïðèìåíåíèÿ ïî ïîðÿäêó <font color=blue>f</font>, <font color=blue>g</font>, <font color=blue>h</font>:
  127. <blockquote>k&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Maybe">Maybe</a></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font></blockquote>
  128. È åñëè êàêàÿ-òî èç òðåõ ôóíêöèé ïîòåðïèò íåóäà÷ó, ôóíêöèÿ <font color=blue>k</font> äîëæíà âåðíóòü <font color=blue>Nothing</font>. Ýòà ôóíêöèÿ óìíîæàåò âõîäíîå ÷èñëî íà 30, åñëè îíî íå äåëèòñÿ öåëî÷èñëåííî íà 2, 3 èëè 5 (à åñëè äåëèòñÿ, ôóíêöèÿ âîçâðàùàåò <font color=blue>Nothing</font>).
  129. Èç ïðåäûäóùåãî ìàòåðèàëà, åñëè âû åãî õîðîøî ïîíÿëè, äîëæíî áûòü ïîíÿòíî, ÷òî âû ìîæåòå çàäàòü <font color=blue>k</font> ÷åðåç ìîíàäè÷åñêóþ êîìïîçèöèþ:
  130. <blockquote>k&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;g&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;h</blockquote>
  131. Èëè ìîæåòå âçÿòü îïåðàòîð <font color=blue>>>=</font>:
  132. <blockquote>k&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;h</blockquote>
  133. Èëè, âîçìîæíî, âàì íðàâèòñÿ <font color=blue>do</font>-íîòàöèÿ:
  134. <blockquote>k&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#06c">do</font>&nbsp;y&nbsp;<font color="#339933">&lt;-</font>&nbsp;f&nbsp;x<br/>
  135. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;<font color="#339933">&lt;-</font>&nbsp;g&nbsp;y<br/>
  136. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;z</blockquote>
  137. Ýòî ïðîñòî, êàê íè êðóòè. {1:  îðèãèíàëå - óñòîé÷èâîå âûðàæåíèå "Any way you slice it", àíàëîãè÷íîå ïî ñìûñëó. - Ïðèì. ïåð.}
  138. À âîîáùå, ôóíêöèþ <font color=blue>h</font> ìîæíî îïðåäåëèòü âîâñå áåç ìîíàäíûõ êîíñòðóêöèé, ýòî áóäåò âûãëÿäåòü òàê:
  139. <blockquote>k&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font color="#06c">case</font>&nbsp;f&nbsp;x&nbsp;<font color="#06c">of</font><br/>
  140. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nothing&nbsp;<font color="#339933">-&gt;</font>&nbsp;Nothing<br/>
  141. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Just&nbsp;y&nbsp;&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font color="#06c">case</font>&nbsp;g&nbsp;y&nbsp;<font color="#06c">of</font><br/>
  142. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nothing&nbsp;<font color="#339933">-&gt;</font>&nbsp;Nothing<br/>
  143. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Just&nbsp;z&nbsp;&nbsp;<font color="#339933">-&gt;</font>&nbsp;h&nbsp;z</blockquote>
  144. Òåïåðü ïîíÿòíî, ïî÷åìó ìîíàäà <font color=blue>Maybe</font> âàæíà. Îíà ðåçêî óïðîùàåò êîä, ñîåäèíÿÿ â öåïü íåñêîëüêî <font color=blue>Maybe</font>-ôóíêöèé. Ïðåäñòàâüòå ñåáå ãðóáûé íåìîíàäè÷åñêèé êîä äëÿ êîìïîçèöèè äåñÿòè <font color=blue>Maybe</font>-ôóíêöèé â òàêîì âèäå. Ïîëó÷èëñÿ áû òàêîé áîëüøîé îòñòóï âïðàâî, ÷òî ÷èòàåìîñòü ñèëüíî ïîñòðàäàëà áû, è îáùàÿ ñòðóêòóðà âû÷èñëåíèé ïîòåðÿëàñü áû â ëàáèðèíòå âëîæåííûõ <font color=blue>case</font>-âûðàæåíèé. Íî ñ ïîìîùüþ ìîíàä êîìïîçèöèÿ äåñÿòè ôóíêöèé çàïèñûâàåòñÿ ïðîñòî:
  145. <blockquote>f11&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f1&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f2&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f3&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f4&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f5&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f6&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f7&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f8&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f9&nbsp;<font color="#339933">&gt;=&gt;</font>&nbsp;f10</blockquote>
  146. èëè (ñ èñïîëüçîâàíèåì <font color=blue>>>=</font>):
  147. <blockquote>f11&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;f1&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f2&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f3&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f4&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f5&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f6&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f7&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f8&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f9&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f10</blockquote>
  148. Ñ ïîìîùüþ ìîíàä êîìïîçèöèÿ ìîíàäè÷åñêèõ ôóíêöèé òàêàÿ æå ïðîñòàÿ, êàê êîìïîçèöèÿ îáû÷íûõ (íåìîíàäè÷åñêèõ) ôóíêöèé.
  149. Ìîíàäà <font color=blue>Maybe</font> î÷åíü ïîëåçíà äëÿ ïîÿñíåíèÿ áàçîâûõ êîíöåïöèé, íî îíà ìîæåò ñáèòü ñ òîëêó: ìíîãèå ëþäè îøèáî÷íî âåðÿò, ÷òî åäèíñòâåííàÿ ðîëü ìîíàä â îáðàáîòêå íåôóíêöèîíàëüíûõ âû÷èñëåíèé, òî åñòü, òåõ âû÷èñëåíèé, êîòîðûå ðàáîòàþò ñ ââîäîì/âûâîäîì (ñ êîíñîëüþ èëè ñ ôàéëîì), ñ èçìåíÿåìûì ãëîáàëüíûì ñîñòîÿíèåì, è òàê äàëåå. À ÿ ïîêàçàë, ÷òî íåêîòîðûå ìîíàäè÷åñêèå âû÷èñëåíèÿ ìîãóò áûòü ñ òåì æå óñïåõîì âûïîëíåíû ñîâñåì áåç ìîíàä. Ïîëó÷àåòñÿ, ÷òî ìîíàäû íå ÷òî-òî îáÿçàòåëüíîå, îíè ïðîñòî <i>î÷åíü</i> óäîáíû. Èìåííî ïîýòîìó ÿ ãîâîðèë, ÷òî äàæå íåñìîòðÿ íà <i>ïåðâîíà÷àëüíóþ</i> ïðè÷èíó èçîáðåòåíèÿ ìîíàä äëÿ íåôóíêöèîíàëüíûõ âû÷èñëåíèé (ðàáîòà ñ <font color=blue>IO</font>), ó íèõ, êàê îêàçàëîñü, ãîðàçäî áîëüøàÿ ïðèìåíèìîñòü. Èç-çà ýòîãî ìîíàäû õîðîøè.
  150. À òåïåðü ïåðåéäåì ê ñëåäóþùåé ìîíàäå.
  151. Ìîíàäà <font color=blue>list</font> (ñïèñîê)
  152. Åñëè ìîíàäà <font color=blue>Maybe</font> âàì ïðîñòî ïîíðàâèëàñü, òî ìîíàäó <font color=blue>list</font> âû äàæå ïîëþáèòå. ;-)  äàííîì ñëó÷àå ìû çàïîëíèì ñëåäóþùåå îïðåäåëåíèå:
  153. <blockquote><font color="#06c">instance</font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Monad">Monad</a></font>&nbsp;<font>&#91;</font><font>&#93;</font>&nbsp;<font color="#06c">where</font><br/>
  154. &nbsp;&nbsp;<font>&#40;</font><font color="#339933">&gt;&gt;=</font><font>&#41;</font>&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<i><font color="#5d478b">{-&nbsp;definition&nbsp;of&nbsp;&gt;&gt;=&nbsp;for&nbsp;lists&nbsp;-}</font></i><br/>
  155. &nbsp;&nbsp;<font>return</font>&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<i><font color="#5d478b">{-&nbsp;definition&nbsp;of&nbsp;return&nbsp;for&nbsp;lists&nbsp;-}</font></i></blockquote>
  156. Çàìåòüòå, ÷òî äëÿ ïðåäñòàâëåíèÿ ïóñòîãî ñïèñêà <font color=blue>[]</font> ìû èñïîëüçóåì ñïèñêîâûé êîíñòðóêòîð òèïà. Ýòî íåáîëüøîé õàê (äëÿ ñïèñêîâ â Haskell âøèòà ñïåöèàëüíàÿ ñèíòàêñè÷åñêàÿ ïîääåðæêà). Íî íè÷åãî íå ïîäåëàåøü.
  157. Êàê è äëÿ âñåõ ìîíàä, ïåðâîé çàäà÷åé áóäåò ïîíÿòü, ÷òî ïðåäñòàâëÿþò èç ñåáÿ ìîíàäè÷åñêèå ôóíêöèè ýòîé ìîíàäû. Äëÿ ñïèñêà ìîíàäè÷åñêàÿ ôóíêöèÿ <font color=blue>f</font> âûãëÿäèò òàê:
  158. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font>b<font>&#93;</font></blockquote>
  159. (ãäå <font color=blue>[b]</font> çíà÷èò, êîíå÷íî, "ñïèñîê ýëåìåíòîâ òèïà <font color=blue>b</font>"). Âñïîìíèòå, ÷òî îáîáùåííîå îïðåäåëåíèå ìîíàäè÷åñêîé ôóíêöèè çàïèñûâàåòñÿ ñëåäóþùèì îáðàçîì:
  160. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;m&nbsp;b</blockquote>
  161. äëÿ íåêîòîðîé ìîíàäû <font color=blue>m</font>, êîòîðàÿ äîëæíà áûòü êîíñòðóêòîðîì òèïà. Ñïèñîê - î÷åâèäíûé êàíäèäàò â ìîíàäó, ïîñêîëüêó "ñïèñîê èç" - ýòî êîíñòðóêòîð òèïà (ïóñòü äàæå åãî ñèíòàêñèñ æåñòêî çàøèò â Haskell); ïî æåëàíèþ, ìû ìîãëè áû îïðåäåëèòü ñïèñîê ñàìè:
  162. <blockquote><font color="#06c">data</font>&nbsp;List&nbsp;a&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;Nil&nbsp;<font color="#339933">|</font>&nbsp;Cons&nbsp;a&nbsp;<font>&#40;</font>List&nbsp;a<font>&#41;</font></blockquote>
  163. Òèï ìîíàäè÷åñêàÿ ôóíêöèé äëÿ íåãî âûãëÿäåë áû ñîîòâåòñòâåííî:
  164. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;List&nbsp;b</blockquote>
  165. Íî ìû áóäåì âñå-òàêè ïðèäåðæèâàòüñÿ ñòàíäàðòíîãî ñèíòàêñèñà.
  166. ×åì ÿâëÿþòñÿ ôóíêöèè ïîäîáíîãî ñîðòà? Îáû÷íî èõ ïîíèìàþò êàê ôóíêöèè, êîòîðûå áåðóò âõîäíîå çíà÷åíèå òèïà <font color=blue>a</font> è ïðîèçâîäÿò êó÷ó çíà÷åíèé òèïà <font color=blue>b</font>, ñîáðàííûõ â îäèí óäîáíûé êîíòåéíåð (ñïèñîê). (È îïÿòü ó íàñ ìîíàäà, êîòîðàÿ âûãëÿäèò êàê êîíòåéíåð.) Äðóãîé ñïîñîá äóìàòü î íèõ êàê î ôóíêöèÿõ, âîçâðàùàþùèõ ìíîæåñòâî çíà÷åíèé, òî åñòü, òàêèå ôóíêöèè âîçâðàùàþò êó÷ó ðàçíûõ çíà÷åíèé "â îäíîì". (ß íå èìåþ â âèäó "ïàðàëëåëüíî", ïîòîìó ÷òî ýòî ïîäðàçóìåâàåò ïàðàëëåëüíóþ îáðàáîòêó, ÷åãî çäåñü íåò.) Ìíîæåñòâåííûå âûõîäíûå çíà÷åíèÿ - ýòî ïðîñòî ýëåìåíòû ñïèñêà. Ïðè èñïîëüçîâàíèè ôóíêöèé íàïîäîáèå ñëåäóþùèõ îòêðûâàþòñÿ ïîëåçíûå ïåðñïåêòèâû:
  167. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font><font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><font>&#93;</font><br/>
  168. g&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font><font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><font>&#93;</font></blockquote>
  169. Çäåñü è <font color=blue>f</font>, è <font color=blue>g</font> ïðèíèìàþò îäíî <font color=blue>Int</font>-çíà÷åíèå è âîçâðàùàþò ìíîãî <font color=blue>Int</font>-çíà÷åíèé. À ÷òî åñëè ìû õîòèì âçÿòü êàæäûé ðåçóëüòàò ôóíêöèè <font color=blue>f</font> è ïðèìåíèòü åãî ê êàæäîìó ðåçóëüòàòó ôóíêöèè <font color=blue>g</font>, êîëëåêöèîíèðóÿ ðåçóëüòàòû ïðèìåíåíèÿ? Áûëî áû çäîðîâî, åñëè áû ýòî ìîæíî áûëî ñäåëàòü íåïîñðåäñòâåííî, áåç ðàñïàêîâêè êàæäîãî ýëåìåíòà èç ñïèñêîâ-ðåçóëüòàòîâ ôóíêöèé <font color=blue>g</font> è <font color=blue>f</font>. È ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ ìîíàäû ñïèñêà.
  170. Äàâàéòå ïåðåéäåì ê áîëåå ìàòåðèàëüíûì ïðèìåðàì ýòèõ ôóíêöèé:
  171. <blockquote>f&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font><font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><font>&#93;</font><br/>
  172. f&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#91;</font>x<font color="#339933">-</font><font color=red>1</font><font color="#339933">,</font>&nbsp;x<font color="#339933">,</font>&nbsp;x<font color="#339933">+</font><font color=red>1</font><font>&#93;</font><br/>
  173. &nbsp;<br/>
  174. g&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;<font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font>&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font><font color=green><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Int">Int</a></font><font>&#93;</font><br/>
  175. g&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#91;</font><font color="#339933">-</font>x<font color="#339933">,</font>&nbsp;x<font>&#93;</font></blockquote>
  176. Êàê æå íàì "ñêîìïîíîâàòü" ýòè äâå ôóíêöèè? <font color=blue>f x</font> âîçâðàùàåò ñïèñîê, è äëÿ ïðèìåíåíèÿ <font color=blue>g</font> ê êàæäîìó ýëåìåíòó íàì íóæíà ôóíêöèÿ <font color=blue>map</font>:
  177. <blockquote>f&nbsp;<font color=red>10</font>&nbsp;&nbsp;&nbsp;<font color="#339933">--&gt;</font>&nbsp;&nbsp;<font>&#91;</font><font color=red>9</font><font color="#339933">,</font>&nbsp;<font color=red>10</font><font color="#339933">,</font>&nbsp;<font color=red>11</font><font>&#93;</font><br/>
  178. <font>map</font>&nbsp;g&nbsp;<font>&#40;</font>f&nbsp;<font color=red>10</font><font>&#41;</font>&nbsp;&nbsp;<font color="#339933">--&gt;</font>&nbsp;&nbsp;<font>&#91;</font><font>&#91;</font><font color="#339933">-</font><font color=red>9</font><font color="#339933">,</font>&nbsp;<font color=red>9</font><font>&#93;</font><font color="#339933">,</font>&nbsp;<font>&#91;</font><font color="#339933">-</font><font color=red>10</font><font color="#339933">,</font>&nbsp;<font color=red>10</font><font>&#93;</font><font color="#339933">,</font>&nbsp;<font>&#91;</font><font color="#339933">-</font><font color=red>11</font><font color="#339933">,</font>&nbsp;<font color=red>11</font><font>&#93;</font><font>&#93;</font></blockquote>
  179. Ýòîò íîâûé ðåçóëüòàò èíòåðåñåí, íî îí íå ìîæåò áûòü êîìïîçèöèåé <font color=blue>f</font> è <font color=blue>g</font>, ïîòîìó ÷òî ó íåãî äðóãîé òèï (ñïèñîê ñïèñêîâ <font color=blue>Int</font>, à íå ïðîñòî ñïèñîê <font color=blue>Int</font>). Ìû ìîæåì åãî ñãëàäèòü â ïðîñòîé ñïèñîê ôóíêöèåé <font color=blue>concat</font> (êîòîðàÿ ïðîñòî ñîåäèíÿåò ñïèñêè â îäèí):
  180. <blockquote><font color="#5d478b">--&nbsp;Îáðàòèòå&nbsp;îñîáîå&nbsp;âíèìàíèå&nbsp;íà&nbsp;òèï&nbsp;concat:&nbsp;[[a]]&nbsp;-&gt;&nbsp;[a]</font><br/>
  181. <font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;g&nbsp;<font>&#40;</font>f&nbsp;<font color=red>10</font><font>&#41;</font><font>&#41;</font>&nbsp;&nbsp;<font color="#339933">--&gt;</font>&nbsp;&nbsp;<font>&#91;</font><font color="#339933">-</font><font color=red>9</font><font color="#339933">,</font>&nbsp;<font color=red>9</font><font color="#339933">,</font>&nbsp;<font color="#339933">-</font><font color=red>10</font><font color="#339933">,</font>&nbsp;<font color=red>10</font><font color="#339933">,</font>&nbsp;<font color="#339933">-</font><font color=red>11</font><font color="#339933">,</font>&nbsp;<font color=red>11</font><font>&#93;</font></blockquote>
  182. Ìû ïîëó÷èëè íàáîð âñåõ ðåçóëüòàòîâ, ïðîèçâåäåííûõ ÷åðåç ïðèìåíåíèå <font color=blue>f</font> ê öåëîìó ÷èñëó è çàòåì ïðèìåíèâ <font color=blue>g</font> ê òîìó, ÷òî ïîëó÷èëîñü ïîñëå <font color=blue>f</font>. Åñëè âû äóìàåòå îá <font color=blue>f</font> è <font color=blue>g</font> êàê î ôóíêöèÿõ, êîòîðûå ñîçäàþò ìíîæåñòâî ðåçóëüòàòîâ "çäåñü è ñåé÷àñ", èõ âûõîäíûå çíà÷åíèÿ áóäóò ìíîæåñòâîì âñåõ âîçìîæíûõ ïðèìåíåíèé ñíà÷àëà ôóíêöèè <font color=blue>f</font>, à çàòåì ôóíêöèè <font color=blue>g</font>. Ìû ìîæåì ïðåäñòàâèòü ýòî â âèäå äèàãðàììû:
  183. <pre>
  184. g | -9
  185. | 9 ----> |
  186. | | 9
  187. |
  188. f | g | -10
  189. 10 ----> | 10 ----> |
  190. | | 10
  191. |
  192. | g | -11
  193. | 11 ----> |
  194. | 11</pre>
  195. Õîðîøî âèäíî, ÷òî êîìïîçèöèÿ <font color=blue>f</font> è <font color=blue>g</font> - ýòî ìíîæåñòâî âñåõ ïóòåé ìåæäó <font color=blue>f</font> è <font color=blue>g</font>.
  196. Ëþáîïûòíî, ÷òî ìû òîëüêî ÷òî îïðåäåëèëè îïåðàòîð <font color=blue>>>=</font> äëÿ ìîíàäû ñïèñêà! Îí çàäàí òàê:
  197. <blockquote><font color="#5d478b">--&nbsp;mv&nbsp;::&nbsp;[a]</font><br/>
  198. <font color="#5d478b">--&nbsp;g&nbsp;&nbsp;::&nbsp;a&nbsp;-&gt;&nbsp;[b]</font><br/>
  199. mv&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;g&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;g&nbsp;mv<font>&#41;</font></blockquote>
  200. ãäå <font color=blue>mv</font> - ýòî ìîíàäè÷åñêîå çíà÷åíèå â ìîíàäå ñïèñêà (êîòîðîå ïðîñòî ñïèñîê çíà÷åíèé òèïà <font color=blue>a</font>).  ïðåäûäóùåì ïðèìåðå <font color=blue>mv</font> - ýòî ðåçóëüòàò âû÷èñëåíèÿ <font color=blue>f 10</font>. Îïðåäåëåíèå ðàáîòàåò äàæå äëÿ ïóñòîãî ñïèñêà <font color=blue>[]</font>, ïîñêîëüêó îòîáðàæåíèå (mapping) ôóíêöèè íà ïóñòîé ñïèñîê äàñò ïóñòîé ñïèñîê, è <font color=blue>concat</font> äëÿ ïóñòîãî ñïèñêà òîæå âñåãäà ïóñòîé ñïèñîê. Ïîëó÷èëîñü î÷åíü ïðîñòîå îïðåäåëåíèå îïåðàòîðà <font color=blue>>>=</font>.
  201. [Çàìåòêà äëÿ ôàíàòîâ GHC: ß âåðþ, ÷òî îïåðàòîð <font color=blue>>>=</font> â êîìïèëÿòîðå GHC ðåàëèçîâàí áîëåå ýôôåêòèâíî è ïî-äðóãîìó, õîòÿ è äåëàåò òî æå ñàìîå.]
  202. Êàê çàäàòü <font color=blue>return</font> äëÿ ýòîé ìîíàäû? Äàâàéòå ïîäóìàåì î ìîíàäè÷åñêîì çíà÷åíèè-ñïèñêå êàê î "äåéñòâèè", âîçâðàùàþùåì ìíîãî çíà÷åíèé. Âñïîìíèì, ÷òî <font color=blue>return</font> äîëæåí áûòü ýêâèâàëåíòîì åäèíè÷íîé ôóíêöèè, - êàê è â äðóãèõ ìîíàäàõ. ×òî áóäåò ýêâèâàëåíòîì åäèíè÷íîé ôóíêöèè â ìîíàäå ñïèñêà? Îíà äîëæíà áðàòü çíà÷åíèå è âîçâðàùàòü "äåéñòâèå", êîòîðîå ïîñëå "âû÷èñëåíèÿ" ïðîñòî âåðíåò ýòî çíà÷åíèå. Òàê ìû ïîíÿëè, ÷òî <font color=blue>return</font> íå ìîæåò ïðîñòî âîçâðàùàòü ïóñòîé ñïèñîê. Ðàçóìíî ïðåäïîëîæèòü î <font color=blue>return</font> ÷òî-òî òàêîå:
  203. <blockquote><font>return</font>&nbsp;<font color="#66cc66"><b>::</b></font>&nbsp;a&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font>b<font>&#93;</font><br/>
  204. <font>return</font>&nbsp;x&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;<font>&#91;</font>x<font>&#93;</font></blockquote>
  205. Òî åñòü, <font color=blue>return</font> ýëåìåíòàðíî ñîçäàåò ñïèñîê èç îòäåëüíîãî çíà÷åíèÿ. Ïðîâåðèì, ñîáëþäàþòñÿ ëè â ýòîì ñëó÷àå ìîíàäíûå çàêîíû:
  206. <blockquote><font color="#5d478b">--&nbsp;f&nbsp;::&nbsp;a&nbsp;-&gt;&nbsp;[b]</font><br/>
  207. <font color="#5d478b">--&nbsp;x&nbsp;::&nbsp;a</font><br/>
  208. <font>return</font>&nbsp;x&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;f&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;f&nbsp;<font>&#40;</font><font>return</font>&nbsp;x<font>&#41;</font><font>&#41;</font>&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  209. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;f&nbsp;<font>&#91;</font>x<font>&#93;</font><font>&#41;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;return</font><br/>
  210. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#91;</font>f&nbsp;x<font>&#93;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;map</font><br/>
  211. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;f&nbsp;x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;concat</font><br/>
  212. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;âûïîëíåíèå&nbsp;ïåðâîãî&nbsp;ìîíàäíîãî&nbsp;çàêîíà</font><br/>
  213. &nbsp;<br/>
  214. <font color="#5d478b">--&nbsp;mv&nbsp;::&nbsp;[a]</font><br/>
  215. mv&nbsp;<font color="#339933">&gt;&gt;=</font>&nbsp;<font>return</font>&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;<font>return</font>&nbsp;mv<font>&#41;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;&gt;&gt;=</font><br/>
  216. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font>x<font>&#93;</font><font>&#41;</font>&nbsp;mv<font>&#41;</font>&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;return</font><br/>
  217. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;Äâà&nbsp;ñëó÷àÿ:</font><br/>
  218. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;Ñëó÷àé&nbsp;1:&nbsp;&nbsp;mv&nbsp;==&nbsp;[]</font><br/>
  219. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font>x<font>&#93;</font><font>&#41;</font>&nbsp;<font>&#91;</font><font>&#93;</font><font>&#41;</font>&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;mv</font><br/>
  220. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#91;</font><font>&#93;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;map</font><br/>
  221. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>&#91;</font><font>&#93;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;concat</font><br/>
  222. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;mv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;mv</font><br/>
  223. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5d478b">--&nbsp;Ñëó÷àé&nbsp;2:&nbsp;&nbsp;mv&nbsp;==&nbsp;[v1,&nbsp;v2,&nbsp;...]</font><br/>
  224. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66"><b>=</b></font>&nbsp;&nbsp;<font>concat</font>&nbsp;<font>&#40;</font><font>map</font>&nbsp;<font>&#40;</font>\x&nbsp;<font color="#339933">-&gt;</font>&nbsp;<font>&#91;</font>x<font>&#93;</font><font>&#41;</font>&nbsp;<font>&#91;</font>v1<font color="#339933">,</font>&nbsp;v2<font color="#339933">,</font>&nbsp;<font color="#339933">...</font><font>&#93;</font><font>&#41;</font>&nbsp;&nbsp;<font color="#5d478b">--&nbsp;ïî&nbsp;îïðåäåëåíèþ&nbsp;mv</font><br/>
  225. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#66cc66">