{"id":154045,"date":"2012-10-23T08:03:03","date_gmt":"2012-10-23T04:03:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=154045"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=154045","title":{"rendered":"<span class=\"post_title\">\u041f\u043e\u0438\u0433\u0440\u0430\u0435\u043c \u0432 \u0441\u043b\u043e\u0432\u0430: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u043e\u0442\u0430-\u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/www.ljplus.ru\/img4\/_\/d\/_darkus_\/3384206_f260.jpg\" align=\"right\"\/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043c\u043d\u043e\u044e \u0432 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/136775\/\">\u00ab\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 N-\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438\u00bb<\/a>. \u041d\u0443 \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043c\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u0433\u0440\u0443 \u00ab\u0432 \u0441\u043b\u043e\u0432\u0430\u00bb \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432\u0432\u043e\u0434\u0430 \u0441\u043b\u043e\u0432 \u043d\u0430 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0431\u0443\u043a\u0432\u043e\u0439 \u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u0437\u043e\u0432\u0451\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430.<\/p>\n<p>  \u0412 \u0447\u0438\u0441\u043b\u0435 \u0441\u0430\u043c\u044b\u0445 \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u044b\u0434\u0432\u0438\u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c.<\/li>\n<li>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u043c\u0435\u0440\u0443 \u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u043c\u044b, \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f, \u0447\u0442\u043e \u0438\u0433\u0440\u043e\u043a \u2014 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u043d\u044b\u043c \u0437\u043d\u0430\u043d\u0438\u0435\u043c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (\u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e :).<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0438\u0433\u0440\u044b \u2014 \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u043b\u0451\u0433\u043a\u043e\u0439 \u0434\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439; \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432.<\/li>\n<\/ul>\n<p>  \u0412\u043e\u0442 \u0441 \u044d\u0442\u0438\u043c \u0431\u0430\u0433\u0430\u0436\u043e\u043c \u0438 \u043d\u0430\u0447\u043d\u0451\u043c. \u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u0432\u043e\u0441\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h1>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h1>\n<p>\u0412 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code>, \u044f\u0432\u043b\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0438\u0436\u0435, \u0430 \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b:<\/p>\n<pre><code class=\"haskell\">import WGCommons import WGFile import WGPlay import WGType <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f? \u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0451 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u0440\u0438\u0447\u0451\u043c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438: \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f), \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0446\u0438\u043a\u043b \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0449\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041d\u0443 \u043f\u0440\u044f\u043c\u043e \u0442\u0430\u043a \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"haskell\">main :: IO () main = do (userName, gameLevel) &lt;- greetings           iniData               &lt;- loadIniFile &quot;wordsgame.ini&quot;           scoreTable            &lt;- loadScoreTableFile &quot;scoretable.ini&quot;           play $ GC (fst gameLevel ++ &quot; &quot; ++ userName) gameLevel iniData scoreTable           farewell <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>greetings<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u0435\u0433\u043e \u0438\u043c\u044f \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0436\u0435\u043b\u0430\u043b \u0431\u044b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c. \u0418\u0445 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u0426\u0438\u043a\u043b \u0438\u0433\u0440\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0449\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439\u2026<\/p>\n<h1>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438\u00bb \u0438\u0433\u0440\u044b<\/h1>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438\u00bb (\u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u043e\u0439 \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0437\u0430\u043f\u0443\u0441\u043a \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043d\u0438\u0445) \u0438\u0433\u0440\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0441\u0430\u043c\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0443\u0436 \u043e\u0442 \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>play<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 <code>main<\/code>, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"haskell\">play :: GameConfiguration -&gt; IO () play gc =   do putStr &quot;\u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0442\u0435\u043c\u0443 - &quot;      putStr (intercalate &quot;, &quot; (map fst $ iniData gc) ++ &quot;: &quot;)      theme &lt;- getLine      case lookup (capitalize $ map toLower theme) (iniData gc) of        Just fn -&gt; playAndSaveScoreTable theme fn (iniData gc)        Nothing -&gt; do putStr &quot;\u0422\u0430\u043a\u0430\u044f \u0442\u0435\u043c\u0430 \u043c\u043d\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430. \u041d\u0430\u0447\u043d\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0430\u043d\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f? &quot;                      yesNo &lt;- getLine                      if yesNo `isElementOf` yesWords                        then do putStr (userName gc ++                                        &quot;, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445: &quot;)                                fn &lt;- getLine                                let newIniData = (theme, fn) : iniData gc                                saveIniFile &quot;wordsgame.ini&quot; newIniData                                playAndSaveScoreTable theme fn newIniData                        else play gc   where     playAndSaveScoreTable theme' fileName' iniData' =       do score &lt;- playOneRound theme' fileName' (snd $ gameLevel gc)          putStr (&quot;\\n\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0438\u0433\u0440\u0443. \u0412\u044b \u043d\u0430\u0431\u0440\u0430\u043b\u0438 &quot; ++ show score ++                  &quot; &quot; ++ setProperCase score (&quot;\u043e\u0447\u043a&quot;, &quot;\u043e&quot;, &quot;\u0430&quot;, &quot;\u043e\u0432&quot;) ++ &quot;. &quot;)          putStrLn (&quot;\u0412\u044b \u0437\u0430\u043d\u044f\u043b\u0438 &quot; ++ show (place score (scoreTable gc)) ++                    &quot; \u043c\u0435\u0441\u0442\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0437\u0430\u0447\u0451\u0442\u0435 \u0438 &quot; ++                    show (placeInTheme theme' score (scoreTable gc)) ++                    &quot; \u043c\u0435\u0441\u0442\u043e \u043f\u043e \u0442\u0435\u043c\u0435 \\&quot;&quot; ++ theme' ++ &quot;\\&quot;.\\n&quot;)          let newScoreTable = (theme', userName gc, score) : scoreTable gc          saveScoreTableFile &quot;scoretable.ini&quot; newScoreTable          willYouPlayAgain iniData' newScoreTable      willYouPlayAgain iniData' scoreTable' =       do putStr (userName gc ++ &quot;, \u0435\u0449\u0451 \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0433\u0440\u0430\u0442\u044c? &quot;)          yesNo &lt;- getLine          when (yesNo `isElementOf` yesWords) $            play gc{iniData = iniData', scoreTable = scoreTable'} <\/code><\/pre>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u041d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u0433\u0440\u044b. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043d\u044f\u0442\u044c, \u0435\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>play<\/code> \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main<\/code>. \u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u0433\u0440\u044b \u0432\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u0433\u0440\u044b, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0447\u043a\u043e\u0432 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0433\u0440\u043e\u043a\u0443 \u043e \u0442\u043e\u043c, \u0432 \u043a\u0430\u043a\u0443\u044e \u0442\u0435\u043c\u0443 \u043e\u043d \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u044b\u0433\u0440\u0430\u0442\u044c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0433\u0440\u044b \u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442, \u0430 \u0438\u0433\u0440\u043e\u043a \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u043c\u044b. \u0418\u0433\u0440\u043e\u043a \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043c\u0443, \u0438 \u0435\u0436\u0435\u043b\u0438 \u0435\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442, \u043d\u0430\u0434\u043e \u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0430\u043d\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u043c\u044b. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u0435\u0447\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u043c\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0438\u0433\u0440\u043e\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0447\u0442\u043e \u043d\u0430\u0434\u043e-\u0442\u0430\u043a\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0442\u0435\u043c\u0443, \u0442\u043e \u0442\u0430 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0435\u0449\u0451 \u0438 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u0430\u044f \u0442\u0435\u043c\u0430 \u0432\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u043e \u0438\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>playAndSaveScoreTable<\/code>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0451 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>playOneRound<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0437\u0436\u0435. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434 \u0438\u0433\u0440\u044b. \u041f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043d\u0430\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043e\u0447\u043a\u0438, \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043e\u0431\u0449\u0435\u043c \u0437\u0430\u0447\u0451\u0442\u0435 \u0438 \u0432 \u0437\u0430\u0447\u0451\u0442\u0435 \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0430\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043e\u0447\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0443 \u0441\u044b\u0433\u0440\u0430\u0442\u044c \u0435\u0449\u0451 \u0440\u0430\u0437. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>willYouPlayAgain<\/code>.<\/p>\n<p>  \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>play<\/code>. \u0412\u0441\u0451, \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0442\u043e\u043c, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d \u0438\u0433\u0440\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>play<\/code> \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>playOneRound<\/code>, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0437\u0430\u043d\u044f\u0442\u043e\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u043c\u0435\u0441\u0442\u043e \u043f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0438\u0433\u0440\u044b. \u041e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0430\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438:<\/p>\n<pre><code class=\"haskell\">place :: Int -&gt; ScoreTableFile -&gt; Int place score scoreTable = 1 + length (takeWhile (&gt; score) $                                reverse $                                sort $                                map (\\(_, _, r) -&gt; r) scoreTable)  placeInTheme :: String -&gt; Int -&gt; ScoreTableFile -&gt; Int placeInTheme theme score scoreTable = 1 + length (takeWhile (&gt; score) $                                             reverse $                                             sort $                                             map (\\(_, _, r) -&gt; r) $                                             filter (\\(t, _, _) -&gt; t == theme) scoreTable) <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0411\u0435\u0440\u0451\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0447\u043a\u043e\u0432 (\u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u044b \u043e\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435), \u0438\u0437 \u043d\u0435\u0451 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0447\u043a\u043e\u0432 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u0438\u0431\u043e \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0447\u043a\u043e\u0432, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u043a. \u041f\u043e\u0442\u043e\u043c \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u043e\u0431\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0447\u043a\u043e\u0432 \u0438\u0433\u0440\u043e\u043a\u0430. \u0414\u0430\u043b\u0435\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u0430\u043a \u0438 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443), \u043e\u0434\u043d\u0430\u043a\u043e \u0436\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u0437-\u0437\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u043c-\u043a\u0430 \u0442\u0430\u043a.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>playOneRound<\/code>. \u041e\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439:<\/p>\n<pre><code class=\"haskell\">playOneRound :: String -&gt; FilePath  -&gt; [Char] -&gt; IO Int playOneRound theme fileName gl = do putStr (&quot;\\n\u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u0418\u0433\u0440\u0430\u0435\u043c \u0432 \\&quot;&quot; ++ theme ++ &quot;\\&quot;. &quot;)                                     wl &lt;- loadWordsData fileName                                     gc &lt;- playGame gl wl                                     saveWordsData fileName (gameData gc)                                     return $ score gc <\/code><\/pre>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430, \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0443\u0440\u043d\u043e\u0433\u043e. \u0412 \u044d\u0442\u043e\u043c \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0441\u0443\u0442\u044c \u0438 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u00ab\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\u00bb, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0447\u0443\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0422\u0430\u043a \u0438 \u0442\u0443\u0442. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434 \u0438\u0433\u0440\u044b, \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432\u043e\u0441\u0442\u043e\u0440\u0436\u0435\u043d\u043d\u043e\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0438\u0433\u0440\u044b, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0438\u0433\u0440\u0443 (\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>playGame<\/code>). \u041f\u043e\u0441\u043b\u0435 \u0438\u0433\u0440\u044b \u043e\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u0451\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0447\u043a\u0438.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>playGame<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u0433\u0440\u0443. \u0412\u043e\u0442 \u0435\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">playGame :: [Char] -&gt; WordDB -&gt; IO RoundConfiguration playGame gl wl = do putStrLn &quot;\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0438\u0433\u0440\u0443.&quot;                     strategy &lt;- getRandomElement strategies                     rc &lt;- makeOneStep gl $ RC wl strategy &quot;&quot; [] 0                     putStrLn (&quot;\\n\u041d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430: &quot; ++                               intercalate &quot; - &quot; (reverse $ namedWords rc) ++ &quot;.&quot;)                     return rc <\/code><\/pre>\n<p>  \u0418 \u043e\u043f\u044f\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0430 :). \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043f\u0440\u043e \u0432\u043e\u0441\u0442\u043e\u0440\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0443\u0436\u0435 \u043d\u0435 \u043f\u0438\u0448\u0443). \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0438\u0433\u0440\u044b (\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435, \u043a\u0430\u043a \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435). \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0438\u0433\u0440\u044b (\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>makeOneStep<\/code>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u044b\u0432\u043e\u0434 \u0441\u043b\u043e\u0432\u0430 \u0440\u043e\u0431\u043e\u0442\u043e\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u0438\u0433\u0440\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b \u0441\u043b\u043e\u0432. \u041d\u0443 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f) \u0438\u0433\u0440\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0432\u0435\u0440\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>makeOneStep<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043f\u043e \u0441\u0443\u0442\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0441\u0435\u0440\u0434\u0446\u0435\u043c\u00bb \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. \u0412\u043e\u0442 \u0435\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">makeOneStep :: [Char] -&gt; RoundConfiguration -&gt; IO RoundConfiguration makeOneStep gl rc =   do (myWN, newStrategy) &lt;- generateWordName gl rc      if myWN == &quot;&quot;        then do putStr (&quot;\u0423 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041d\u0430\u0443\u0447\u0438\u0442\u0435 (\u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u0431\u0443\u043a\u0432\u0443 &quot; ++                        [lastLetter $ currentWord rc] ++&quot;): &quot;)                getUserAnswer newStrategy (currentWord rc) (namedWords rc) 2        else do putStr (&quot;\u041c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - &quot; ++ map toUpper myWN ++                        &quot;. \u041d\u0430\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u0431\u0443\u043a\u0432\u0443 &quot; ++ [lastLetter myWN] ++ &quot;: &quot;)                getUserAnswer newStrategy myWN (myWN : namedWords rc) 1   where     getUserAnswer ns s nl dp =       do userWN &lt;- getUserWordName $ lastLetter s          if userWN `elem` nl            then do putStr &quot;\u0422\u0430\u043a\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0443\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437: &quot;                    getUserAnswer ns s nl dp            else if userWN `isElementOf` surrenderWords                   then return rc{currentWord = s, namedWords = nl}                   else makeOneStep gl $ RC (updateWordList (gameData rc) userWN)                                            ns                                            userWN                                            (userWN:nl)                                            (score rc + dp) <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0431\u043e\u0442\u043e\u043c (<code>generateWordName<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0437\u0436\u0435). \u0415\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u043e (\u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0433\u0440\u044b \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b, \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0443 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0430\u0440\u0430 \u2014 \u043d\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0438\u0433\u0440\u044b. \u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0431\u043e\u0442, \u043f\u0443\u0441\u0442\u043e\u0435, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443 \u0431\u043e\u0442\u0430 \u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430, \u0438 \u0438\u0433\u0440\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0443\u0436\u0435 \u0438\u0433\u0440\u043e\u043a\u0443 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e, \u043d\u0430\u0447\u0438\u0441\u043b\u044f\u044f \u0435\u043c\u0443 \u0437\u0430 \u044d\u0442\u043e 2 \u043e\u0447\u043a\u0430 (\u0437\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u2014 1 \u043e\u0447\u043a\u043e). \u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u043b\u043e\u0432\u043e \u0443 \u0431\u043e\u0442\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u043e \u043e\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0430 \u0438\u0433\u0440\u043e\u043a\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0431\u0443\u043a\u0432\u0443 \u0441\u043b\u043e\u0432\u0430, \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u043e\u043c.<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>getUserAnswer<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0433\u0440\u0430\u0435\u0442 \u0431\u043e\u0442, \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0441\u043b\u043e\u0432 \u0438 \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u0447\u043a\u043e\u0432 \u0438\u0433\u0440\u043e\u043a\u0430. \u041a\u0430\u043a \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435 \u2014 \u0435\u0441\u043b\u0438 \u0443 \u0431\u043e\u0442\u0430 \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u043e \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e 1, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e 2. \u0412 \u044d\u0442\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0431\u0443\u043a\u0432\u0443, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439: \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0441\u043b\u043e\u0432\u043e \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0432\u0432\u0451\u043b \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0432, \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0441\u0434\u0430\u0451\u0442\u0441\u044f (\u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f). \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043d\u043e\u0432\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>makeOneStep<\/code> \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u0433\u0440\u044b.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>getUserWordName<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u043e \u0443 \u0438\u0433\u0440\u043e\u043a\u0430. \u0412\u043e\u0442 \u0435\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">getUserWordName :: Char -&gt; IO WordName getUserWordName ' ' = getLine getUserWordName fl  = do userWN' &lt;- getLine                          let userWN = capitalize $ map toLower userWN'                          if userWN `isElementOf` surrenderWords ||                             userWN \/= &quot;&quot; && head userWN == toUpper fl                            then return userWN                            else do putStr (&quot;\u0411\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b. \u041d\u0430\u0437\u043e\u0432\u0438\u0442\u0435 \u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u0431\u0443\u043a\u0432\u0443 &quot; ++                                            [fl] ++ &quot; \u0438\u043b\u0438 \u0441\u0434\u0430\u0432\u0430\u0439\u0442\u0435\u0441\u044c: &quot;)                                    getUserWordName fl <\/code><\/pre>\n<p>  \u041e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u043e. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u0447\u0442\u043e \u043e\u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u044e\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0433\u0440\u043e\u043a \u0441\u0434\u0430\u0451\u0442\u0441\u044f (\u0442\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u044b\u0448\u0435), \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0447\u0442\u043e \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u0431\u0443\u043a\u0432\u0443. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f.<\/p>\n<p>  \u0422\u0430\u043a, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u043e\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f \u0438\u0433\u0440\u044b. \u0422\u0443\u0442 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e. \u0417\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u0431\u043e\u0442\u0430 (\u043a\u0430\u043a \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0438\u0433\u0440\u044b. \u0412\u0441\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u0438 \u043f\u043e\u0437\u0436\u0435 \u043c\u044b \u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0430 \u0432\u0434\u0443\u043c\u0447\u0438\u0432\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c (\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445) \u043d\u043e\u0432\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439. \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0431\u043e\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0435\u043c\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0435\u043c\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u0433\u0440\u044b.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c:<\/p>\n<pre><code class=\"haskell\">generateWordName :: [Char] -&gt; RoundConfiguration -&gt; IO (WordName, GameStrategy) generateWordName gl rc   | null $ currentWord rc = do wordPair &lt;- getRandomElement $ gameData rc                                wn &lt;- getRandomElement $ snd wordPair                                return (wn, strategy rc)   | null $ gameData rc    = return (&quot;&quot;, strategy rc)   | null wl'              = return (&quot;&quot;, strategy rc)   | null wl''             = return (&quot;&quot;, strategy rc)   | otherwise             = do wn &lt;- strategy rc (currentWord rc) wl''                                if null wn                                  then do newStrategy &lt;- getRandomElement strategies                                          generateWordName gl rc{strategy = newStrategy}                                  else return (wn, strategy rc)   where     wl'  = filter (\\x -&gt; fst x == lastLetter (currentWord rc)) (gameData rc)     wl'' = [wn | wn &lt;- snd $ head wl',                  wn `notElem` namedWords rc,                  lastLetter wn `elem` gl] <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0431\u043e\u0442\u043e\u043c. \u041e\u043d\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0443\u044e \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043b\u043e\u0432\u0430 \u0438\u0437 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u043e\u0432\u0430, \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438. \u041d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0435 \u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u0440\u043e\u0431\u043e\u0442\u043e\u043c \u0441\u043b\u043e\u0432\u043e\u043c. \u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u0412\u0442\u043e\u0440\u043e\u0435 \u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0431\u043e\u0442\u0430 \u0435\u0449\u0451 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0443\u0441\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432, \u0442\u043e\u0433\u0434\u0430 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043e\u043d \u0441\u043b\u043e\u0432 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0443 \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u043e\u0432\u043e. \u0422\u0440\u0435\u0442\u044c\u0435 \u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u044e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0431\u043e\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u0432 \u0431\u0430\u0437\u0435, \u043d\u043e \u043d\u0435\u0442 \u0441\u043b\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u0431\u0443\u043a\u0432\u0443. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0442\u043e\u0436\u0435 \u0441\u0434\u0430\u0451\u0442\u0441\u044f. \u0427\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0435 \u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u044e, \u043a\u043e\u0433\u0434\u0430 \u0438 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0438 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u0435\u0441\u0442\u044c, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c (\u043f\u0435\u0447\u0430\u043b\u044c \u0436\u0435). \u0418 \u0431\u043e\u0442\u0443 \u043e\u043f\u044f\u0442\u044c \u043d\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0430\u043a \u0441\u0434\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0441\u043b\u043e\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b 2 \u043e\u0447\u043a\u0430.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u044e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u043e\u0432\u0430 \u0435\u0441\u0442\u044c, \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0431\u043e\u0442\u0430. \u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u043e\u0432\u0430, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043f\u044f\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u0430 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u2014 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0443\u0439\u0434\u0451\u0442 \u0435\u0449\u0451 \u043d\u0430 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043d\u0438\u0437, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u2014 \u043e\u043d\u0430 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0436\u0435, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438\u0433\u0440\u044b \u0434\u043b\u044f \u0431\u043e\u0442\u0430. \u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"haskell\">firstWordStrategy :: GameStrategy firstWordStrategy _ = return . head  randomWordStrategy :: GameStrategy randomWordStrategy _ = getRandomElement  sameLetterStrategy :: GameStrategy sameLetterStrategy wn wl | wn  == &quot;&quot; = return &quot;&quot;                          | wl' == [] = return &quot;&quot;                          | otherwise = getRandomElement wl'   where     ll  = last wn     wl' = filter (\\l -&gt; lastLetter l == ll) wl  certainLetterStrategy :: Char -&gt; GameStrategy certainLetterStrategy c _ wl = do let wl' = filter (\\l -&gt; lastLetter l == c) wl                                   if wl' == []                                     then return &quot;&quot;                                     else getRandomElement wl'  hardLetterStrategy :: GameStrategy hardLetterStrategy _ wl = do let wl' = filter (\\l -&gt; lastLetter l `elem` hardLetters) wl                              if wl' == []                                then return &quot;&quot;                                else getRandomElement wl'   where     hardLetters = &quot;\u0451\u0439\u044b&quot;  strategies :: [GameStrategy] strategies = firstWordStrategy :                randomWordStrategy :                sameLetterStrategy :                hardLetterStrategy :                map certainLetterStrategy ['\u0410'..'\u042f'] <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <code>strategies<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e 33 + 4 = 37 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439. \u0412\u043e\u0442 \u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li><code>firstWordStrategy<\/code> \u2014 <i>\u043d\u0430\u0438\u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f<\/i> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043b\u043e\u0432.<\/li>\n<li><code>randomWordStrategy<\/code> \u2014 <i>\u043f\u0440\u043e\u0441\u0442\u0430\u044f<\/i> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043b\u043e\u0432.<\/li>\n<li><code>sameLetterStrategy<\/code> \u2014 <i>\u0445\u0438\u0442\u0440\u0430\u044f<\/i> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0431\u0443\u043a\u0432\u0443, \u0447\u0442\u043e \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u0451\u0442 \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0431\u0443\u043a\u0432\u0443, \u0447\u0442\u043e \u0438 \u0438\u0433\u0440\u043e\u043a \u0434\u0430\u043b \u0431\u043e\u0442\u0443.<\/li>\n<li><code>certainLetterStrategy<\/code> \u2014 <i>\u043d\u0430\u0433\u043b\u0430\u044f<\/i> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u0412\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0451\u0442 \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0431\u0443\u043a\u0432\u0443. \u0415\u0441\u043b\u0438 \u0431\u0443\u043a\u0432\u0430 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0442\u043e \u0438\u0433\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0431\u043e\u0442\u0443 \u0432\u0437\u0431\u0440\u0435\u043b\u043e \u0432 \u0435\u0433\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0443\u043c \u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0431\u0443\u043a\u0432\u0443, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab\u0429\u00bb, \u0442\u043e \u0438\u0433\u0440\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u0431\u043e\u0442\u0430.<\/li>\n<li><code>hardLetterStrategy<\/code> \u2014 <i>\u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f<\/i> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u041d\u0443 \u0430 \u044d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u0431\u0443\u043a\u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438 \u0434\u0430\u0451\u0442 \u0438\u0433\u0440\u043e\u043a\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u043d\u0430 \u044d\u0442\u0443 \u0431\u0443\u043a\u0432\u0443.<\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0435\u0449\u0451 \u0434\u0432\u0443\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041f\u0435\u0440\u0432\u0430\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u043e\u0442 \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u043b, \u0432 \u0435\u0433\u043e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e\u0442 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">updateWordList :: WordDB -&gt; WordName -&gt; WordDB updateWordList []                wn                      = [(toUpper $ head wn, [wn])] updateWordList (wl@(wlf, _):wls) wn@(wnh:_) | wlf == wnh = updateWordList' wl wn : wls                                             | otherwise  = wl : updateWordList wls wn   where     updateWordList' (fl, [])  wn'                  = (fl, [wn'])     updateWordList' (fl, wl') wn' | wn' `elem` wl' = (fl, wl')                                   | otherwise      = (fl, wn':wl') <\/code><\/pre>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442, \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043d\u0435\u0442. \u041d\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043d\u0435\u043a\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u0435\u0449\u0451 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0435\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0446\u0438\u043a\u043b:<\/p>\n<pre><code class=\"haskell\">isKnown :: String -&gt; IniFile -&gt; Bool isKnown theme = any (\\(t, fp) -&gt; t == theme) <\/code><\/pre>\n<p>  \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>True<\/code>, \u0435\u0441\u043b\u0438 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0442\u0435\u043c\u0430 \u0438\u0433\u0440\u044b \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0431\u043e\u0442\u0443. \u041d\u043e, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0434\u0430\u0436\u0435 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0439\u0434\u0451\u0442 \u044d\u0442\u0443 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0443 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u2014 \u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0437. \u0412\u0441\u0451.<\/p>\n<h1>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h1>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 <code>WGFile<\/code> \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438. \u0421\u044e\u0434\u0430 \u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<p>  \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u0444\u0430\u0439\u043b\u043e\u0432: \u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u0438 \u0444\u0430\u0439\u043b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0438\u0433\u0440\u044b (\u043f\u043e \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0442\u0435\u043c\u0435). \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0432\u0441\u0435 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 (\u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f). \u041e\u043f\u0438\u0448\u0435\u043c \u0435\u0451:<\/p>\n<pre><code class=\"haskell\">loadFile :: FilePath -&gt; FileManager a -&gt; IO a loadFile filePath fm = catch readContents                              (\\e -&gt; do putStrLn (msgIOError fm ++ &quot;\\n&quot;)                                        return $ parser fm &quot;&quot;)   where     readContents = do cnt &lt;- readFile filePath                       let {                             fileData = parser fm cnt;                             qnt      = quantifier fm fileData                           }                       if validator fm fileData                         then putStrLn (msgParseError fm ++ &quot;\\n&quot;)                         else putStrLn (msgSuccess fm ++ show qnt ++ &quot; &quot; ++                                        setProperCase qnt (unit fm) ++ &quot;.\\n&quot;)                       return fileData <\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <code>FileManager<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043d\u0438\u0436\u0435).<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u0440\u0451\u0445 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0442\u0438\u043f\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u041e\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"haskell\">loadIniFile :: FilePath -&gt; IO IniFile loadIniFile filePath = loadFile filePath iniFileManager   where     iniFileManager = FM \t                 {                        parser        = parseIniFile,                        validator     = null,                        quantifier    = length,                        unit          = (&quot;\u0442\u0435\u043c&quot;, &quot;\u0430&quot;, &quot;\u044b&quot;, &quot;&quot;),                        msgIOError    = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. &quot; ++                                        &quot;\u0412\u0441\u0451 \u043c\u043e\u0451 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 &quot; ++                                        &quot;(\u043b\u0438\u0431\u043e \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c &quot; ++                                        &quot;\u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438).&quot;,                        msgParseError = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u0424\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d. &quot; ++                                        &quot;\u0412\u0441\u0451 \u043c\u043e\u0451 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 &quot; ++                                        &quot;(\u043b\u0438\u0431\u043e \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c &quot; ++                                        &quot;\u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438).&quot;,                        msgSuccess    = &quot;\u0424\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d. \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e &quot;                      }  loadScoreTableFile :: FilePath -&gt; IO ScoreTableFile loadScoreTableFile filePath = loadFile filePath stFileManager   where     stFileManager = FM                     {                        parser        = parseScoreTableFile,                        validator     = null,                        quantifier    = length,                        unit          = (&quot;\u0437\u0430\u043f\u0438\u0441&quot;, &quot;\u044c&quot;, &quot;\u0438&quot;, &quot;\u0435\u0439&quot;),                        msgIOError    = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 &quot; ++                                        &quot;\u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432. \u0412\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.&quot;,                        msgParseError = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u0424\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d. &quot; ++                                        &quot;\u0412\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.&quot;,                        msgSuccess    = &quot;\u0424\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d. \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e &quot;                     }  loadWordsData :: FilePath -&gt; IO WordDB loadWordsData filePath = loadFile filePath dataFileManager   where     dataFileManager = FM \t                  {                         parser        = parseWordsData,                         validator     = null,                         quantifier    = numberOfWords,                         unit          = (&quot;\u0441\u043b\u043e\u0432&quot;, &quot;\u043e&quot;, &quot;\u0430&quot;, &quot;&quot;),                         msgIOError    = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. &quot; ++                                         &quot;\u041c\u043e\u0451 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f &quot; ++                                         &quot;\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.&quot;,                         msgParseError = &quot;\u041e\u0428\u0418\u0411\u041a\u0410: \u0424\u0430\u0439\u043b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d. \u041c\u043e\u0451 &quot; ++                                         &quot;\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 &quot; ++                                         &quot;\u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.&quot;,                         msgSuccess    = &quot;\u0424\u0430\u0439\u043b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e &quot;                       } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>FileManager<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>loadFile<\/code>. \u0414\u0430, \u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c <nobr><code>validator = null<\/code><\/nobr> \u043d\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0444\u0430\u0439\u043b\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 :). \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0440\u0430\u0432\u0435\u043d \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443 <code>null<\/code> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f <code>Prelude<\/code>, \u0438 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u044d\u0442\u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>True<\/code> \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b, \u0447\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0442\u0438\u043f\u0430 <code>Parsec<\/code>. \u041d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"haskell\">parseIniFile :: String -&gt; IniFile parseIniFile = map parseIniPair . lines  parseIniPair :: String -&gt; (WordName, FilePath) parseIniPair s = (theme, dropWhile (not . Data.Char.isAlpha) rest)   where     (theme, rest) = break (== ':') s <\/code><\/pre>\n<p>  \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u0435\u0441\u044c \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440, \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0430\u0437\u0430 \u0441\u043b\u043e\u0432 \u043f\u043e \u044d\u0442\u043e \u0442\u0435\u043c\u0435. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0410 \u0432\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">parseScoreTableFile :: String -&gt; ScoreTableFile parseScoreTableFile = map parseScoreTableLine . lines  parseScoreTableLine :: String -&gt; (WordName, String, Int) parseScoreTableLine s = (theme, name, result)   where     (theme, rest) = break (== ':') s     (name, rest') = break (== ':') $ dropWhile (not . Data.Char.isAlpha) rest     result        = read $ dropWhile (not . Data.Char.isDigit) rest' <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u043e\u0435\u043a, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 \u0432\u0438\u0434\u0430 (\u0442\u0435\u043c\u0430, \u0438\u043c\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u043e\u0447\u043a\u0438). \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b (<code>:<\/code>). \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0441\u043b\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">parseWordsData :: String -&gt; WordDB parseWordsData = map parseWordsList . lines  parseWordsList :: String -&gt; WordList parseWordsList (w:ws) = (w, parseWords $ dropWhile (not . isGoodSymbol) ws)  parseWords :: String -&gt; [WordName] parseWords &quot;&quot; = [] parseWords wl = word : parseWords (dropWhile (not . isGoodSymbol) rest)   where     (word, rest) = break (== ',') wl <\/code><\/pre>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e. \u0411\u0430\u0437\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u043e\u0434\u043d\u0443 \u0431\u0443\u043a\u0432\u0443. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043c \u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0444\u0430\u0439\u043b\u044b. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u043e\u0439 \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u043f\u043e\u0442\u043e\u043c \u0442\u0440\u0438 \u0435\u0451 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0430\u044f:<\/p>\n<pre><code class=\"haskell\">saveFile :: FilePath -&gt; String -&gt; IO () saveFile = writeFile <\/code><\/pre>\n<p>  \u041d\u0435 \u0433\u0443\u0441\u0442\u043e :). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>writeFile<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0438 \u0441\u0442\u0440\u043e\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u0430. \u041d\u0443 \u0430 \u0432\u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0440\u0451\u0445 \u0442\u0438\u043f\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">saveIniFile :: FilePath -&gt; IniFile -&gt; IO () saveIniFile filePath iniData   = saveFile filePath              (concatMap (\\(theme, path) -&gt; theme ++ &quot;: &quot; ++ path ++ &quot;\\n&quot;) $       sortBy (comparing fst) iniData)  saveScoreTableFile :: FilePath -&gt; ScoreTableFile -&gt; IO () saveScoreTableFile filePath scoreTable   = saveFile filePath              (concatMap (\\(theme, userName, score) -&gt; theme ++ &quot;: &quot; ++ userName ++                                                       &quot;: &quot; ++ show score ++ &quot;\\n&quot;) $       sortBy themeAndScore scoreTable)   where     themeAndScore (theme1, _, score1) (theme2, _, score2)       | theme1 == theme2 = reverseOrder $ compare score1 score2       | otherwise        = compare theme1 theme2     reverseOrder LT = GT     reverseOrder EQ = EQ     reverseOrder GT = LT   saveWordsData :: FilePath -&gt; WordDB -&gt; IO () saveWordsData filePath wl   = saveFile filePath              (convertToString $ sortBy (comparing fst) $ improve wl) <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u2014 \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0435\u0451 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u2014 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432\u0441\u0451.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"haskell\">improve :: WordDB -&gt; WordDB improve = map (second sort) <\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u043e\u0432\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 \u0441\u043b\u043e\u0432 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0431\u0430\u0437\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0412\u043e\u0442 \u044d\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0417\u0430\u0447\u0435\u043c? \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a.<\/p>\n<pre><code class=\"haskell\">convertToString :: WordDB -&gt; String convertToString = concatMap wordLine   where     wordLine (c, wl) = c : (&quot;: &quot; ++ intercalate &quot;, &quot; wl ++ &quot;\\n&quot;) <\/code><\/pre>\n<p>  \u041d\u0443 \u0430 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0441\u043b\u043e\u0432 \u0432 \u043e\u0434\u043d\u0443 \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b.<\/p>\n<h1>\u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h1>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 <code>WGCommons<\/code> \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u0431\u043e\u0440\u043d\u0430\u044f \u0441\u043e\u043b\u044f\u043d\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"haskell\">gameLevels :: [GameLevel] gameLevels = [(&quot;\u041d\u0435\u043e\u0444\u0438\u0442&quot;,   &quot;\u0410\u0411\u0412\u0413\u0414\u0417\u0418\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0424\u0425&quot;),               (&quot;\u0410\u0434\u0435\u043f\u0442&quot;,    &quot;\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042d\u042e\u042f&quot;),               (&quot;\u0410\u043f\u043e\u043b\u043e\u0433\u0435\u0442&quot;, &quot;\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042b\u042d\u042e\u042f&quot;)] <\/code><\/pre>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0433\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443, \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0433\u0440\u044b, \u0432\u0442\u043e\u0440\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u043e, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0431\u043e\u0442\u043e\u043c \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<p>  \u0418\u043b\u0438 \u0432\u043e\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422\u0438\u043f\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043c\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445:<\/p>\n<pre><code class=\"haskell\">getRandomElement :: [a] -&gt; IO a getRandomElement l = fmap (l !!) $ randomRIO (0, length l - 1) <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0441\u043b\u043e\u0432\u043e (\u0432\u0441\u0435 \u0431\u0443\u043a\u0432\u044b \u0438 \u0434\u0435\u0444\u0438\u0441):<\/p>\n<pre><code class=\"haskell\">isGoodSymbol :: Char -&gt; Bool isGoodSymbol c = Data.Char.isAlpha c  || c `elem` &quot;\u0447\u0451-\u0427\u0401&quot; <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Unicode \u0432 GHC. \u041f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e GHC \u043f\u043b\u043e\u0445\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0431\u0443\u043a\u0432\u0430\u043c \u00ab\u0401\u00bb, \u00ab\u0427\u00bb \u0438 \u00ab\u042f\u00bb \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 GHC \u0438 Haskell Platform \u042d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0430, \u043d\u043e \u0432 \u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0441\u0430\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0438\u0433\u0440\u0430, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 \u043a\u043e\u0441\u0442\u044b\u043b\u0438. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0442\u0430\u043a\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">toUpper :: Char -&gt; Char toUpper c | Data.Char.isAlpha c = Data.Char.toUpper c           | c == '\u0451'            = '\u0401'           | c == '\u0447'            = '\u0427'           | c == '\u044f'            = '\u042f'           | otherwise           = c  toLower :: Char -&gt; Char toLower c | Data.Char.isAlpha c = Data.Char.toLower c           | c == '\u0401'            = '\u0451'           | c == '\u0427'            = '\u0447'           | c == '\u042f'            = '\u044f'           | otherwise           = c <\/code><\/pre>\n<p>  \u0421 \u0447\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443. \u0411\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0451\u043c.<\/p>\n<p>  \u041d\u0443 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043f\u043e\u043b\u043d\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u043e \u0431\u044b \u044d\u0442\u0443 \u0438 \u0431\u0435\u0437 \u0442\u043e\u0433\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u043e \u043d\u0435\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u043c\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0442\u0430\u043c \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b, \u0447\u0442\u043e \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0441\u043e\u0431\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435\u0442 \u2014 \u0438\u0445 \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0430\u043c\u043e\u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d.<\/p>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0442\u0430\u043a \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0434\u0435\u0436\u0430 \u0434\u043b\u044f \u0438\u043c\u0435\u043d\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c (\u00ab1 \u0437\u0430\u043f\u0438\u0441\u044c\u00bb, \u00ab2 \u0437\u0430\u043f\u0438\u0441\u0438\u00bb, \u00ab5 \u0437\u0430\u043f\u0438\u0441\u0435\u0439\u00bb). \u0412\u043e\u0442 \u0435\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">setProperCase :: Int -&gt; WordParadigm -&gt; String setProperCase i (root, ns, gs, gp) | iMod100 &gt; 10 && iMod100 &lt; 20 = root ++ gp                                    | iMod10 == 1                  = root ++ ns \t\t\t\t\t\t\t\t   | iMod10 &gt;= 2 && iMod10 &lt;= 4   = root ++ gs \t\t\t\t\t\t\t\t   | otherwise                    = root ++ gp   where     iMod10  = i `mod` 10     iMod100 = i `mod` 100 <\/code><\/pre>\n<p>  \u0421\u043b\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b (\u0441\u043c. \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>WordParadigm<\/code> \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435). \u0412\u0441\u0435 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 1, \u043a\u0440\u043e\u043c\u0435 11 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0451\u043c, \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0412\u0441\u0435 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 2, 3 \u0438\u043b\u0438 4, \u043a\u0440\u043e\u043c\u0435 12, 13 \u0438 14 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0438\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 11, 12, 13 \u0438 14, \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0434\u0435\u0436\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0422\u0430\u043a\u043e\u0432 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<h1>\u0412\u0441\u0435 \u0442\u0438\u043f\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435<\/h1>\n<p>\u0412\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u044d\u0442\u043e \u043d\u0435\u0433\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0441\u0430\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0438\u0433\u0440\u0430, \u043c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0442\u0430\u043a \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0443\u0447\u0430 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">type IniFile = [(WordName, FilePath)]  type ScoreTableFile = [(WordName, String, Int)] <\/code><\/pre>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0442\u0435\u043c \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043c \u043f\u0443\u0442\u0435\u0439 \u043a \u0444\u0430\u0439\u043b\u0430\u043c, \u0430 \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u043e\u0435\u043a (\u0442\u0435\u043c\u0430, \u0438\u043c\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0447\u043a\u043e\u0432). \u041a\u0430\u043a, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0438 \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0440\u0438 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0441\u043b\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">type WordName = String  type WordList = (Char, [WordName])  type WordDB = [WordList] <\/code><\/pre>\n<p>  \u0421\u043b\u043e\u0432\u043e \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0430\u0440\u0430, \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0430\u0440\u044b. \u042d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u0443 \u0430 \u0441\u0430\u043c\u0430 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0435\u0441\u0442\u044c \u043d\u0438\u0447\u0442\u043e \u0438\u043d\u043e\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a. \u0422\u0443\u0442 \u043d\u0430\u0434\u043e \u0431\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0430\u0434 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e. \u0422\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f <code>Data.Map<\/code> \u0431\u044b\u043b \u0431\u044b \u043b\u0443\u0447\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0441\u043b\u043e\u0432\u0430 \u0432 \u043d\u0430\u0448\u0435\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043b\u0438\u043d\u0433\u0432\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0434\u0435\u0436 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0434\u043b\u044f \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0441 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"haskell\">type WordParadigm = (String, String, String, String) <\/code><\/pre>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"haskell\">type GameLevel = (WordName, [Char]) <\/code><\/pre>\n<p>  \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u0442\u0438\u043f\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u043e\u0439 \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"haskell\">type GameStrategy = WordName -&gt; [WordName] -&gt; IO WordName <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u043e\u0442\u043e\u043c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u0445. \u041d\u0443 \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0445 \u0432\u0441\u0435\u0433\u043e-\u0442\u043e \u0442\u0440\u0438.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u0440.). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432. \u0412\u043e\u0442 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">data FileManager a = FM                      {                        parser        :: String -&gt; a,                        validator     :: a -&gt; Bool,                        quantifier    :: a -&gt; Int,                        unit          :: WordParadigm,                        msgIOError    :: String,                        msgParseError :: String,                        msgSuccess    :: String \t\t\t\t\t } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c <code>parser<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041f\u043e\u043b\u0435 <code>validator<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043b\u0435 <code>quantifier<\/code> \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043c, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0431\u043e\u0442\u0443; \u0430 \u0434\u043b\u044f \u0431\u0430\u0437\u044b \u0441\u043b\u043e\u0432 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u0431\u0430\u0437\u0435, \u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0434\u043e \u0438\u043d\u0430\u0447\u0435, \u043d\u0435\u0436\u0435\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u043f\u0438\u0441\u043a\u0430). \u041f\u043e\u043b\u0435 <code>unit<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f. \u0422\u0440\u0438 \u043f\u043e\u043b\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>msg<\/code> \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430, \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0410\u0422\u0414 \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b. \u0412\u043e\u0442 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"haskell\">data GameConfiguration = GC                          {                            userName   :: String,                            gameLevel  :: GameLevel,                            iniData    :: IniFile,                            scoreTable :: ScoreTableFile                          } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442: \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u0433\u0440\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432.<\/p>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0410\u0422\u0414 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430:<\/p>\n<pre><code class=\"haskell\">data RoundConfiguration = RC                           {                             gameData    :: WordDB,                             strategy    :: GameStrategy,                             currentWord :: WordName,                             namedWords  :: [WordName],                             score       :: Int                           } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u044f \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442: \u0431\u0430\u0437\u0443 \u0441\u043b\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u044b, \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0438\u0433\u0440\u044b \u0431\u043e\u0442\u0430, \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043b\u043e\u0432\u043e, \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b \u0441\u043b\u043e\u0432 \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0447\u043a\u043e\u0432.<\/p>\n<h1>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043e. \u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u043c\u0438\u043b\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0448\u0443 \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0410 \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<ul>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"http:\/\/hpaste.org\/76123\"><b>WordsGame.hs<\/b><\/a> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430.<\/li>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"http:\/\/hpaste.org\/76489\"><b>WGPlay.hs<\/b><\/a> \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438.<\/li>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"http:\/\/hpaste.org\/76582\"><b>WGFile.hs<\/b><\/a> \u2014 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/li>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"http:\/\/hpaste.org\/76609\"><b>WGCommons.hs<\/b><\/a> \u2014 \u043e\u0431\u0449\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/li>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"http:\/\/hpaste.org\/76130\"><b>WGType.hs<\/b><\/a> \u2014 \u0441\u0431\u043e\u0440\u043d\u0438\u043a \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<\/ul>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0438 \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0434\u043e\u0448\u043b\u0438 \u0440\u0443\u043a\u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0451. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432\u044b\u0448\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0442\u0438\u043b\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d.<\/p>\n<p>  \u0412\u0434\u0443\u043c\u0447\u0438\u0432\u044b\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0430 \u0434\u043e\u0441\u0443\u0433\u0435 \u043d\u0430\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<ol>\n<li>\u0412 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u0443\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u043d\u0430\u0434\u044b <code>State<\/code> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u043c\u043e\u043d\u0430\u0434\u0430.<\/li>\n<li>\u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a.<\/li>\n<li>\u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u00ab\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438\u00bb (<i>pretty printing combinators<\/i>).<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f GHC \u0441 \u0431\u0443\u043a\u0432\u0430\u043c\u0438 \u00ab\u0401\u00bb, \u00ab\u0427\u00bb \u0438 \u00ab\u042f\u00bb \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430. \u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u0434\u0430 \u043a\u043e\u0441\u0442\u044b\u043b\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>WGCommons<\/code>.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0441\u043b\u043e\u0432 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f <code>Data.Map<\/code>).<\/li>\n<\/ol>\n<p>  \u041d\u0443 \u0438 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0445\u043e\u0447\u0443 \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0442\u043e \u043d\u0430\u0448\u0451\u043b \u0432 \u0441\u0435\u0431\u0435 \u0441\u0438\u043b\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u0442. \u0434. :).<\/p>\n<p>  <b>\u041c\u043e\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u043e\u0445\u0430\u0431\u0440\u0435 \u043f\u0440\u043e \u044f\u0437\u044b\u043a Haskell:<\/b>  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/blogs\/Haskell\/134291\/\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e-\u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0444\u0440\u0430\u0437 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044f\u0437\u044b\u043a\u0430 Haskell \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0445 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0445 \u0446\u0435\u043f\u0435\u0439 \u041c\u0430\u0440\u043a\u043e\u0432\u0430<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/blogs\/Haskell\/135127\/\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f N-\u0433\u0440\u0430\u043c\u043c \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e \u0415\u042f-\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/blogs\/Haskell\/136007\/\">\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0441\u043a\u0430\u0437\u043e\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/136775\/\">\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 N-\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/149712\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 (\u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0445) \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/154045\/\"> http:\/\/habrahabr.ru\/post\/154045\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/www.ljplus.ru\/img4\/_\/d\/_darkus_\/3384206_f260.jpg\" align=\"right\"\/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Haskell \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043c\u043d\u043e\u044e \u0432 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/136775\/\">\u00ab\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 N-\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438\u00bb<\/a>. \u041d\u0443 \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043c\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u0433\u0440\u0443 \u00ab\u0432 \u0441\u043b\u043e\u0432\u0430\u00bb \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432\u0432\u043e\u0434\u0430 \u0441\u043b\u043e\u0432 \u043d\u0430 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0431\u0443\u043a\u0432\u043e\u0439 \u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u0437\u043e\u0432\u0451\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430.<\/p>\n<p>  \u0412 \u0447\u0438\u0441\u043b\u0435 \u0441\u0430\u043c\u044b\u0445 \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u044b\u0434\u0432\u0438\u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c.<\/li>\n<li>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u043c\u0435\u0440\u0443 \u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u043c\u044b, \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f, \u0447\u0442\u043e \u0438\u0433\u0440\u043e\u043a \u2014 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u043d\u044b\u043c \u0437\u043d\u0430\u043d\u0438\u0435\u043c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (\u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e :).<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0438\u0433\u0440\u044b \u2014 \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u043b\u0451\u0433\u043a\u043e\u0439 \u0434\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439; \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432.<\/li>\n<\/ul>\n<p>  \u0412\u043e\u0442 \u0441 \u044d\u0442\u0438\u043c \u0431\u0430\u0433\u0430\u0436\u043e\u043c \u0438 \u043d\u0430\u0447\u043d\u0451\u043c. \u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u0432\u043e\u0441\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-154045","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/154045","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=154045"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/154045\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=154045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=154045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=154045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}