tag:blogger.com,1999:blog-3208941668630248550.post8990240812497211756..comments2024-03-13T10:43:06.615+02:00Comments on 18-ть лет с Delphi: Может быть кто-то расскажет мне про монады?Alex W. Lulinhttp://www.blogger.com/profile/08400475846894229767noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-3208941668630248550.post-62591826422003211382013-10-21T23:05:52.383+03:002013-10-21T23:05:52.383+03:00По-моему - я что-то понял - http://18delphi.blogsp...По-моему - я что-то понял - http://18delphi.blogspot.com/2013/10/blog-post_21.html<br />Вопрос - ПРАВИЛЬНО ли я понял?Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-47583161314762323502013-07-29T19:58:15.746+03:002013-07-29T19:58:15.746+03:00Вы меня кстати - простите за резкость, если что. М...Вы меня кстати - простите за резкость, если что. Меня просто иногда бесит - когда люди банальные для них вещи - не могут объяснить мне. Но это - мои проблемы. Я с ними - борюсь.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-84130412100450974312013-07-29T19:21:47.447+03:002013-07-29T19:21:47.447+03:00По мне - БНФ - нагляднее.
Но к монадам - я ещё ве...По мне - БНФ - нагляднее.<br /><br />Но к монадам - я ещё вернусь. Жаль не знаю координат собеседника :-)Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-82078495538527227862013-07-29T17:27:02.163+03:002013-07-29T17:27:02.163+03:00Как видите - придумали. =)Как видите - придумали. =)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-91122711180971037772013-07-28T19:35:47.984+03:002013-07-28T19:35:47.984+03:00Спасибо конечно. Попытались.
Если уж про "па...Спасибо конечно. Попытались.<br /><br />Если уж про "парсеры" и выразительность, то по-моему выразительнее БНФ - никто пока ничего не придумал.<br /><br />Пример декларативности по-моему - yacc/lexx. Хотя есть у меня к ним вопросы.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-45644630568255306292013-07-28T13:37:11.387+03:002013-07-28T13:37:11.387+03:00>"Может изобразите?" - типа на слабо?...>"Может изобразите?" - типа на слабо? Нет, не изображу. Я не привык - на слабо.<br />На самом деле я специально выбрал для примера парсинг текста, т.к считаю что у вас в этом деле много опыта. Ну что ж - коль не хотите, это ваше дело. Никто вас не заставляет, и никто не хочет отнимать у вас время. =)<br />>В общем - про монады - не рассказали :-(<br />Ну, я хотя бы попробовал. =)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-83198999358785814352013-07-28T13:17:05.384+03:002013-07-28T13:17:05.384+03:00Да я понимаю, что там написано.
Но всё равно - ра...Да я понимаю, что там написано.<br /><br />Но всё равно - разговор слепого с глухим.<br /><br />"Может изобразите?" - типа на слабо? Нет, не изображу. Я не привык - на слабо.<br /><br />Да и я лично продолжаю считать это "набором закорючек". Удивляюсь я. Зачем люди придумывают себе сложности, а потом героически их преодолевают. А потом рассказывают, что "это выразительно".<br /><br />НЕ выразительно.<br /><br />В общем - про монады - не рассказали :-(Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-653012407390122072013-07-28T09:36:52.947+03:002013-07-28T09:36:52.947+03:00А вы не понимаете что там написано? Прочитайте опи...А вы не понимаете что там написано? Прочитайте описание выше. И, поверьте мне, если бы я хотел компактности, я бы записал компактно(http://pastebin.com/8Sc26dg1). А данный код выигрывает именно по читаемости. Вообще мне сложно представить более читаемый код. Может изобразите? =)<br />И я же не говорил что вы не можете использовать библиотеки?<br />Монада это не дополнительное понятие. Это такое же понятие как "коллекция", "итератор", итд. А помогает она тем, что может просто описать императивность, последовательность действий. Но именно описать, а не совершить.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-60913602960998932272013-07-28T08:56:18.663+03:002013-07-28T08:56:18.663+03:00Для того, чтобы обсуждать "подобного рода&quo...Для того, чтобы обсуждать "подобного рода" - надо понимать что там написано. Это во-первых. Китайский язык - может быть и занятен. Но явно - не ВЫРАЗИТЕЛЕН. По-моему вы всё-таки путаете ВЫРАЗИТЕЛЬНОСТЬ с КОМПАКТНОСТЬЮ. Это - не то же самое. Во-вторых - использовать библиотеки - я тоже могу. В ЛЮБОМ языке. В-третьих - так я и не понял - что такое монады и как введение этого понятия помогает нефункциональным вещам стать функциональными. Иначе - непонятно - зачем изобретать какие-то дополнительные понятия.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-40058393466331312592013-07-28T07:50:27.043+03:002013-07-28T07:50:27.043+03:00В каком плане "не убедил"? У вас есть бо...В каком плане "не убедил"? У вас есть более выразительные средства для подобного рода операций? Я бы не прочь ознакомиться. =)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-86123338518855966742013-07-28T07:23:32.079+03:002013-07-28T07:23:32.079+03:00Мда. "Не убедил".
Не в этой жизни видим...Мда. "Не убедил".<br /><br />Не в этой жизни видимо.... :-(Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-47972219095783302032013-07-28T07:05:25.524+03:002013-07-28T07:05:25.524+03:00Можно. Вот написал парсер конфигураций. Конфигурац...Можно. Вот написал парсер конфигураций. Конфигурации представляют собой пары название := значение. В роли значений могут выступать либо строки либо другие конфигурации, указаные в фигурных скобках. Например:<br />name1 := "string value";<br />name2 := "string value2";<br />name3 := { <br /> name3a := "string value3a";<br /> name3b := "string value3b";<br /> };<br />Код с комментариями, хотя по мне - они лишние.<br />http://pastebin.com/tEiqGVwH<br /><br />Это, собственно, пример монады как описания. Т.е сама по себе монада Parser ничего не парсит. Парсит функция "parseTest", используя описание, предоставленное монадой.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-31546845600799200492013-07-28T00:07:52.342+03:002013-07-28T00:07:52.342+03:00Ничего не понял...
А можно пример из реальной жизн...Ничего не понял...<br />А можно пример из реальной жизни? В духе - вот есть задача - вот так её решаем.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-30825636807780743502013-07-27T06:38:18.403+03:002013-07-27T06:38:18.403+03:00Сами по себе монады детерминированны. Монады это п...Сами по себе монады детерминированны. Монады это просто описание. В случае IO можно сказать что хаскель строит описание действий программы. Компилятор в последствии создаёт из этого описания программу. Т.е с точки зрения хаскеля IO a >> IO b это вполне себе детерминированная функция.<br />Обычно соединение монады и монадической функции выглядит так: после того как будет выяснено значение монады, оно будет передано функции, которая вернёт ещё одну монаду. А там они уже радостно соединятся как монада - монада. =)<br />Монадическая функция служит только для создания монады.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-5035738768233028412013-07-26T21:22:38.121+03:002013-07-26T21:22:38.121+03:00Повторю вопрос - что компилятор делает со сцепками...Повторю вопрос - что компилятор делает со сцепками "монада - функция"? Или "функция - монада"?<br /><br />На "бытовом уровне". Считали из файла (который недетерминированный). Получили значение. Передаём в функцию. Она детерминирована?<br /><br />Что с ней делает компилятор? "Изолирует" от детерминированных функций?Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-69875322637257724442013-07-26T21:19:11.428+03:002013-07-26T21:19:11.428+03:00Сцепки "монада - монада". Без выхода. По...Сцепки "монада - монада". Без выхода. Понимаю. Но "монада - функция". Не понимаю.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-90530216459471954632013-07-26T21:15:51.479+03:002013-07-26T21:15:51.479+03:00Не очень понимаю - как компилятор может их "н...Не очень понимаю - как компилятор может их "не трогать" - ему же важна детерминированность функций. Или я ошибаюсь?Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-52663282865305409172013-07-26T18:53:47.187+03:002013-07-26T18:53:47.187+03:00С точки зрения хаскеля("категории hask")...С точки зрения хаскеля("категории hask") монады - это обычный класс типов. Компилятор обрабатывает специальным образом только "IO" и "ST", другие монады он не трогает. =)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-69742639916745236352013-07-26T17:52:16.309+03:002013-07-26T17:52:16.309+03:00Я правильно понимаю, что монада это "хинт&quo...Я правильно понимаю, что монада это "хинт" компилятору, что "тут начинается недетерминированная зона"?Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-887844633565628642013-07-25T22:48:01.289+03:002013-07-25T22:48:01.289+03:00Спасибо. Вот тут - есть над чем подумать.
Спасибо. Вот тут - есть над чем подумать.<br />Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-42782975436519463082013-07-25T16:28:16.780+03:002013-07-25T16:28:16.780+03:00Фунукции в ФП действительно не являются подпрограм...Фунукции в ФП действительно не являются подпрограммами. В императивном языке вы работаете с подпрограммами, компилятор не имеет права превратить код во что-либо другое. Хотя он это и делает, но это "обман", и некоторые оптимизации для него не позволительны. В ФП функция это отображение из 'a' в 'b', и совершенно не важно как оно произойдёт, главное что бы оно подчинялось описаным правилам. В реальности вызова функции может и не быть, а для "манёвров" компилятора остаётся максимум места. Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-13243054477775581372013-07-25T16:21:31.140+03:002013-07-25T16:21:31.140+03:00Дело тут, похоже, не в чьей-то "тупизне"...<br />Дело тут, похоже, не в чьей-то "тупизне", а в моей неспособности объяснить простым языком. =(<br />Ладно, попробую ещё раз:<br />Начнём с того что монада это класс типов. Это означает что для всех типов этого класса определены некоторые функции(можно провести аналогию с "интерфейсом" в ООП). Надеюсь тут всё понятно?<br />Далее: монада это не обычный "интерфейс", его можно представить как "шаблонный интерфейс" параметризуемый одним параметром.<br />IO String - монада с типом String, например.<br />IO Int - монада с типом Int<br />[Bool] - монада с типом Bool,<br />Maybe Int - монада с типом Int.<br />итд.<br />Далее: что за функции определены в "интерфейсе" монады? Есть три основные функции(одну дополнительную опустим):<br />1) Функция ">>". Она берёт две монады(одного типа, IO, например) и возвращает третью монаду того же типа.<br />При этом первая и вторая монада могут быть "параметризованы" различными типами, останется только параметр-значение второй.<br />Например IO Int >> IO String будет IO String.<br />2) Функция ">>=". Производит "связывание" монады и монадической функции. Монадическая функция - это такая функция, которая возвращает монаду.<br />Допустим у нас есть функция String -> IO (). Т.е функция принимает строку, и возвращает пустую монаду. Так, например, поступает функция вывода в консоль.<br />И у нас есть монада IO String. Так, например, выглядит монада читающая строку из консоли. Связывание "исполняет" монадическую функцию, используя значение из монады.<br />IO String >> (String -> IO ()) будет IO ().<br />Т.е getLine >>= putStrLn, выведет строку, полученную из ввода. Т.к getLine это монада (IO String), а putStrLn это монадическая функция (String -> IO () ). Скобки () означают пустое значение. <br />3) Функция "return". Функция предельно простая - она помещает значение в монаду. Т.е return 1 для IO вернёт IO Int,<br />для списка - [Int], для Maybe - Maybe Int.<br /><br />Впрочем, не думаю что это объяснение намного лучше предыдущего. Но надеюсь вы хоть общее представление получили. =)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-82819167896532452572013-07-25T12:03:44.139+03:002013-07-25T12:03:44.139+03:00"В функциональных языках функции не считаются..."В функциональных языках функции не считаются программами или подпрограммами"<br /><br />"Вы на воздушном шаре"<br /><br />И что? Какая разница - что чем "считается". Гораздо важнее, что чем - ЯВЛЯЕТСЯ.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-38254503779782764262013-07-25T12:02:04.657+03:002013-07-25T12:02:04.657+03:00Можно по-русски? На бытовом уровне. Для тупых. А н...Можно по-русски? На бытовом уровне. Для тупых. А не в закорючках?<br /><br />В закорючках - я уже читал :-) И не раз.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-3208941668630248550.post-25105713711606517602013-07-25T11:48:48.819+03:002013-07-25T11:48:48.819+03:00Простите, но первую часть - вообще не понимаю.Простите, но первую часть - вообще не понимаю.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.com