О монадических технологиях

    Кирпичёв правильно пишет про небрежность интуитивного понимания императивных языков: http://antilamer.livejournal.com/300607.html.

    Однако, мне кажется, что важно было бы озвучить, что всё то, что сейчас скрывается под именем «монада» — само по себе достаточно спутанно в плане педагогики и евангелизма.  Классическая шутка SPJ/Вадлера звучит как «нам следовало назвать ЭТО warm fuzzy things, чтобы не пугать людей теоркатом».  Шутка поразительно недальновидная.   Проблема лежит в той же плоскости, что и называние стоящих перед тобой задач словом «stuff» (это то, с чем борется Аллен в своём GTD).  
    Монады в настоящий момент являются миру как сложный ком из исторически обусловленных причин, проблем, решений, технических возможностей и теоретических основ (как алгебраических, так и аспектов теории вычислений). 
    Все эти наслоения можно (и нужно) расщепить в первом приближении так (порядок приблизительно случайный):
    • стремление к экспликации эффектов (чистое внедрение императивно-подобных моментов в вычисление), (см. труды Вадлера);  здесь мы включаем ввод-вывод, STM, параллельные вычисления и проч.)
    • удобный механизм для материализации базовых микро-стратегий вычисления — вызов функции (call-by-name/call-by-value), многозначность, смена состояния (присваивания!), обработка исключений, останов при неудаче, continuations, бэктрекинг;
    • typeclasses как механизм внесения монад в язык, и как следствие — удобный механизм для мета-перехвата вычисления (невероятно удобно для domain-specific embedded languages);
    • строгая проверка типов, проистекающая из использования typeclasses, и позволяющая механически проверять корректность использования объектов;
    • существование монадических законов, в которые укладываются монады, что позволяет материализовывать абстрактные комбинаторы; это позволяет находить порой неожиданные изоморфизмы между различными предметными областями, а также помогает при оптимизации и верификации программ;
    • проработанная теоретическая основа (теория категорий), на которой базируются монады; это облегчает жизнь создателям базовых библиотек, на которых потом базируется всё реальное программирование;
    • монады — лишь один из классов в длинной цепочке интересных алгебраически обусловленных классов, некоторые из которых слабее монад, а некоторые — сильнее: Functor, Applicative, Monoid, Traversable, Foldable, Monad со товарищи, Arrow со товарищи;
    • стремление к материализации некоторых видов вычислений в алгебраическую структуру (моноидальные вычисления); это открывает широкий простор для оптимизаций, верификации программ, создания абстрактных комбинаторов, а также устранение unbounded recursion — по мощности результатов это похоже на то, как когда-то ввод-вывод был надежно изолирован в IO Monad;

    Потратим по паре абзацев на каждый пункт.
    Экспликация эффектов. Clean первым (ЕМНИП) справился с тем, чтобы уложить ввод-вывод в экосистему чистого ленивого языка.  Ввод-вывод — лишь первый эффект, с которым справились таким образом.  Сейчас всё, что не укладывается в чистоту и ленивость, оформляется в виде эффектов: транзакции (и их взаимодействие с вводом-выводом), генераторы случайных чисел, синхронизация при параллельных вычислениях).    Кроме того, что связано с внешним миром, сюда также идут вычисления, которые не укладываются в родную семантику языка — например, строгое вычисление аргументов функций (как во всех императивных языках).
    Эффекты позволяют беспокоиться только о четком ограниченном подмножестве проблемы, ведь всё что вне эффектов — это очень «простые» вещи, которые не могут «навредить» — там нет deadlocks, там не надо думать о барьерах и порядке вычисления.  Чудовище, таким образом, загоняется в клетку.
    См. 1. SPJ «Beautiful concurrency» http://www.ece.iastate.edu/~pjscott/beautiful.pdf2. Wadler «The essence of functional programming» http://mynd.rinet.ru/~alexm/monads/essence.pdf3. SPJ «Tackling the awkward squad» http://research.microsoft.com/en-us/um/people/simonpj/papers/marktoberdorf/4. Киселёв et al. «Purely Functional Lazy Non-deterministic programming» http://www-ps.informatik.uni-kiel.de/~sebf/pub/icfp09.html
    Базовые микро-стратегии вычисления.  Не забываем, что люди, стоявшие у истоков Haskell, в первую очередь были заинтересованы в программировании самого компилятора.  С помощью монад можно эксплицировать все базовые процессы, происходящие при вычислении — вызовы функций с разными методами передачи аргументов, лексическую и динамическую вложенность переменных (Env), обработку исключений, выразить присваивание через машину состояний (State), неоднозначные вычисления (amb/List), вычисления с неудачей (Maybe/Error), continuations (Cont), бэк-трекинг. 
    Отдельной областью исследований были также модульные интерпретаторы, реализованные через монады и сопутствующие monad transformers. Такая конструкция позволяла конструировать интерпретатор нужного языка (например, арифметика + вызов функций + неоднозначность) простым комбинированием отдельных компонентов интерпретатора.   Каждый отдельный компонент изолирован от остальных и позволяет раздельную разработку.
    Понятно, что такой подход позволяет один раз написать соответствующий блок, проверить его, и использовать для любой задачи, требующей создания интепретатора или даже компилятора).
    См. 1. Guy L. Steele Jr. «Building Interpreters by Composing Monads», http://mynd.rinet.ru/~alexm/monads/steele.pdf2. S. Liang, P. Hudak «Modular Denotational Semantics for Compiler Construction» http://mynd.rinet.ru/~alexm/monads/liang2.pdf3. S. Liang, P. Hudak «Modular Monadic Semantics», 1998 http://flint.cs.yale.edu/trifonov/cs629/modular-monadic-semantics.pdf
    Механизм для мета-перехвата вычислений.  Монады в Haskell реализуются через typeclasses, которые чем-то похожи то ли на interfaces в Яве, то ли на concepts в C++.   Typeclasses совершенно ортогональны монадам!   Typeclasses позволяют «перехватить» вычисление в другой тип результата.   
    Например, можно написать на Haskell функцию для вычисления корней квадратного уравнения.  Её можно вычислить, передав ей три аргумента — тогда она вернет пару корней.   С помощью typeclasses можно «вычислить» эту функцию в другом контексте так, что результатом вычисления будет код на JavaScript, который представляет собой JavaScript-функцию, вычисляющую корни квадратного уравнения.    
    Таким образом, можно отделить разработку базового алгоритма от способа его вычисления.
    Активно развивающейся областью сейчас является написание DSL для параллельных вычислений.  Можно написать на Haskell векторизованный алгоритм, к котором потом написать ряд бэкендов: для SSE, для CUDA, для обычного C, для любой другой векторизующей технологии, которая ещё не появилась.   Естественно, алгоритм этот можно попросту вычислять прямо из Haskell, чтобы отлаживать его принципиальную корректность.
    См. 1. презентацию Lennar Augustsson «Strongly Types DSEL»  http://www.infoq.com/presentations/Strongly-Typed-DSEL-Lennart-Augustsson (в конце идёт рассказ о языке для генерации Excel-файлов); PDF
    2. http://hackage.haskell.org/package/accelerate
    3. http://cdsmith.wordpress.com/2009/09/20/side-computations-via-type-classes/  (без монад вообще);
    Монадические законы, теоретические основы, младшие и старшие братья монад.  Обеспечивают возможность формально доказать некоторые базовые вещи, чтобы быть хоть сколько-то уверенным в том, что фундамент не подведет.  Это интересно не только авторам самых базовых библиотек, но и тем, кто добрался до задач с такой сложностью, когда каждая возможность автоматической самопроверки приветствуется с энтузиазмом.  
    Вместе со строгой проверкой типов это позволяет ловить ситуации, когда задача недопонята, сформулирована противоречиво, или просто сложнее, чем кажется.  Также это позволяет развивать программу, резко снижая вероятность внесения ошибочных изменений.   Так, Galois в своей презентации говорят, что постоянно пытаются закодировать те или иные требования к коду в виде сигнатуры типов.  
    Также формальная структура (в том числе в моноидальном стиле) открывает широкий простор для оптимизаций на уровне компилятора (в том числе, управляемых программистом через механизм rules).  Некоторые жёстко структурированные функции удаётся соптимизировать максимально близко к машинному коду, при этом не жертвуя абстрактностью исходного кода.
    См. 1. http://www.galois.com/blog/2009/04/27/engineering-large-projects-in-haskell-a-decade-of-fp-at-galois/
    2. http://comonad.com/reader/2009/iteratees-parsec-and-monoid/  (моноидальный стиль)
    3. http://www.cse.unsw.edu.au/~dons/papers/CLS07.html (dons et al. «Stream Fusion: From Lists to Streams to Nothing at All)
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 103
    • +14
      Куски моего мозга заляпали стены… :-)
      • 0
        это примерно полтора года изучения вопроса, около 1000 прочитанных страниц.

        • +8
          Это просто неумение писать понятно.
          Такие записки хороши только для собственного блокнота, который никому не надо показывать. Поток сознания.
          Однако, мне кажется, что важно было бы озвучить, что всё то, что

          Какова конструкция? А из этого состоит весь текст.
          • +2
            покажите несколько постов на Хабре, которые Вам кажутся понятными

            поучусь ;)
            • +3
              «Clean первым (ЕМНИП) справился с тем, чтобы уложить ввод-вывод в экосистему чистого ленивого языка. Ввод-вывод — лишь первый эффект, с которым справились таким образом.»

              Достаточно не использовать слова «экспликация» и объяснять суть. Кто такой Clean? Зачем использовать аббревиатуру ЕМНИП? Что за экосистема, она действительно имеет отношение к делу или добавлена для сложности? Что такое эффект в данной статье? Каким именно образом справились с вводом-выводом? А что, были какие-то проблемы?

              И такое недоумение по всему тексту, увы.
              • +5
                я, к сожалению, забыл предупредить, видимо, что этот текст написан для уровня (наверное) Upper-Intermediate (но по стандартам, здесь сложившимся — Ultra-High Advanced).

                Если Вам дать книгу «Физика полупроводников», Вы же не станете говорить «книга написана непонятно! Что это за зоны Бриллюэна?! Что это за неопределенность Гейзенберга?!!! Устраните неопределенность, а потом учите!», не правда ли?

                Да, этот текст предполагает достаточно существенное знакомство с проблематикой и вообще желание в ней самостоятельно разобраться.

                Clean — это язык программирования, почитайте про него. Значение аббревиатуры ЕМНИП можно найти на sokr.ru. Чтобы узнать, что такое экосистема языка, надо попрограммировать на нём с годик. Проблемы с вводом-выводом — обычные для чистых строгих ленивых функциональных языков: почитайте, что это такое — ничего плохого от этого не случится, а случится только хорошее :)

                Вполне возможно, что Вам просто никогда не понадобится ничего из того, что здесь упоминается. Это нормально. Я протестую только против подхода, что любой текст должен быть немедленно понятен.
                • +4
                  Возможно, я плохо пояснил: я комментировал не содержание, я комментировал структуру.
                  Можно сказать «Представитель Теттигониодеа пребывал в одной из жизненной форме растений», а можно — «В траве сидел кузнечик». В этой статье был выбран первый первый способ, хотя, судя по комментариям, вторым способом Вы владеете замечательно.

                  Хорошая книга тем и отличается, что очень хорошо структурирована, в ней четко обозначена проблема и нет лишних слов в описании решений этой проблемы. Раз уж хотите писать научным языком, то используйте научные статьи в качестве примера. Взять хотя бы Вашу ссылку номер 3. Замечательная статья, выполненная по всем правилам композиции.
                  • 0
                    Эмс… А зачем нечто писать, если это не добавит ничего нового в осознание проблемы читающим? Ничего нового про Haskell вы не сказали. Всё, что сказали — можно самостоятельно вычитать. В чём смысл?
                    • +2
                      это говорит мне человек, написавший 1500 комментариев на Хабре? :)
                      • +1
                        :) Я просто интерпретирую ваши же слова, показывая несостоятельность позиции. Если вы тут пишите, значит, хотите нечто донести людям. Если же вы после этого посылаете их к чтению всяких сторонних трудов и к самостоятельному освоению теории категорий, зачем вы написали это всё тогда? Просто бы дали ссылку: вот хороший учебник по теории категорий. Кому надо, поймёт, кому не надо — не будет чувствовать себя идиотом. Вот о чём речь.
                • 0
                  Спасибо Вам за интересный пост, я его увидел сначала в Вашем ЖЖ по ссылке то ли у avva, то ли у lionet. Много интересных ссылок, нужно вдумчиво их читать. Очень жаль, что такая травля пошла.

                  Если кто-то заинтересован в том, чтобы опубликовать на Хабре доступное для местной аудитории руководство по монадам, развеять всю «сложность» и «таинственность», которую им приписывают, то нужно сделать перевод вот этого поста blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
                • 0
                  А мне такой поток сознания более понятен.
                • 0
                  А за эти полтора года вы что-нибудь полезное на haskell-е написали?
                  Ну то есть не проверку двухдольности графа, а что-нибудь, что реально работает и приносит людям пользу.
                  • –1
                    ох господи, что за напасть!

                    ещё один вопрос из преисподней!
                    • 0
                      Жизнь не удалась?
                      Мир дерьмо?
                      Все вокруг из преисподни?
                      Может стоит попробовать антидепресанты?
                      ;-)
                    • 0
                      у меня конечно меньше чем полтора года. но написал кое-какие полезные мелкие тулзы, на которые не хочется запускать питон.
                      может конечно не так много нового надо в последнее время, но везде где раньше использовал питон, вполне спокойно применяю хаскель. единственное что нехватает twisted и amqp, так что придется походу както писать свою замену.
                      но пока не создалось впечатления что хаскель хоть в чемто ущербнее чем питон, разве что местами настолько ленивый, что не хочет работать =)
                      • 0
                        реквестирую кстати amqp-клиент для хаскелля

                        github, anyone?
                      • 0
                        Вот именно об этом и хотелось бы статьи почитать — о практическом применении haskell.
                        А то, имхо, кроме Real World Haskell, на эту тему и почитать нечего :(

                        PS
                        а вы в команде работаете или одиночка? Просто если в команде, интересно как коллеги отнеслись к haskell-коду в репозитории? ;-)
                        • 0
                          в комманде, но у каждого свои границы ответственности, так что кроме меня с моим кодом никто не пытается разбираться.
                          писать статьи я думаю мне пока действительно рано, т.к. монады я не понял (ну кроме того что так можно выполнять чтото с побочными эффектами), теорию категорий не освоил =) и в большинстве случаев, наверняка, делаю все в не тру-хаскель стиле.
                          да и что вообще можно писать: где хаскель оказался реально удобнее и где с хаскелем пришлось много иметься. Пока все мои проблемы укладываются в то, что я начал применять его недавно, а находки — да какие это находки, когда каждый кто прочитает мануал будет все это знать?
                          Ведь если кто не знает, и в питоне есть и greenlets, и coroutines, а еще есть stackless python, но многим это просто ненадо, я вот немного знаю тех кому это надо =)
                          p.s. пока меня лично приводит в восторг смена парадигмы, незнаю как кому, но мне просто нравится функциональное программирование.
                    • +3
                      это примерно полтора года изучения вопроса, около 1000 прочитанных страниц.

                      Основная ценность Haskell: почувствуй себя крутым :)
                      • 0
                        ну это уже вообще ПТУ какое-то

                        для полного счастья мне не хватает тут комментария «чё очки нацепил, умный самый?»

                        дааа, ребята… :-(
                        • +4
                          Неа. Не будет такого комментария, потому что 'был бы умный, разобрался бы до конца'. Ну, извиняюсь, какого хрена нужно живописать всё это монадное благолепие и всю его дружбу с вводом/выводом, когда IO написана на чистом C? Нафига тогда плодить все эти сложности? Вот когда на Haskell можно будет написать драйвер для мышки, я вам скажу: да, люди решили проблему с I/O в чистом функциональном языке. А пока — хрень, хренью. С кучей умных слов, чтобы пудрить мозги окружающим и понижать самооценку непросвящённым.

                          То же самое было бы, если бы, я бы тут вдруг начал вам рассказывать о декогерентизации, унитарных преобразованиях, квантовом преобразовании Фурье (да-да-да, я знаю умные слова :), и впаривать о том, как квантовые компьютеры взламывают RSA на счёт раз. Только где этот квантовый компьютер, кроме как в теоретических построениях математиков, служащих токмо для мерения пузами?

                          Практического смысла в Haskell пока почти нет никакого. И не надо о нём рассказывать, как о языке, решающем все проблемы информатики. Иначе, получается слишком агрессивно, слишком сложно, слишком отпугивающе. А между тем здравые идеи в Haskell есть. И надо их излагать не демонстрируя собственную крутость (что нисколько не умно), а демонстрируя полезность этих идей для людей, интересующихся другими вещами. Они, может, вообще доктора наук по теории аппроксимации, а вы сюда приходите, кидаетесь умными словами и называете их ПТУ'шниками. Какого фига? Haskell только позорите.
                          • 0
                            > Практического смысла в Haskell пока почти нет никакого.

                            угу. лет через пятнадцать в очередном дистрибутиве PHP всё это появится, и Вы начнете этим пользоваться да нахваливать. Лямбду вам уже подогнали, не прошло и 30 лет.

                            Это называется «вечно плестись в хвосте». :)
                    • 0
                      А я думал, что наличие высшего образования гарантирует понимание подобных текстов. Я ошибался или я — идиот?
                      • +2
                        Высшего образования достаточно для понимания таких текстов. Проблема лишь в том, что в России _такое_ высшее образование не получить. Нужна специализация в области computer science. Я читал SICP (вводный курс по программированию в MIT), и мне более-менее понятно о чем идет речь в статьей.
                        • +1
                          интересно при этом, что высшего образования у меня нет.
                        • 0
                          в Вашем вопросе так много нарушений логических уровней (по Бейтсону), что я даже не знаю, как на него ответить… :)
                          • 0
                            Да, я это увидел, только перечитав коммент :)
                            /me помечает в блокнотике «Не писа́ть в хабр нетрезвым»
                      • –1
                        Изучай Хаскель ради добра?! o_O
                        • +2
                          Простите, просто разрыв между пропагандируемой добротой Хаскеля и суровой действительностью оказался настолько большим, что у меня случился когнитивный диссонанс. Вообще автор молодец, что разбирается в таких вопросах.
                          • +2
                            я не знаю что там про пропаганду, но Вас же (я надеюсь) не удивляет, что математика состоит как из арифметики, так и из топосов Гротендика? :)
                            • 0
                              Но вы в общеобразовательной школе не приходите рассказывать про топосы, так? :) Тем более так блокнотно и несвязно.
                              • +7
                                я с сожалением констатирую, что похоже, многие на Хабре привыкли находиться в положении птенцов с широко раскрытыми клювиками, в который заботливые родители вкладывают небольшие полупережеванные кусочки пищи.

                                Вы действительно постоянно ощущаете себя в общеобразовательной школе, со всеми сопутствующими обстоятельствами?

                                Я нигде не говорил, что это такой специальный туториал, начинающийся со слов «Здравствуй, малыш! Ты, наверное, замечал, что в последнее время твой компилятор стал часто ругаться особенно страшными и длинными словами! Давай-ка вместе споём песенку про грибок, а потом попробуем разобраться, что же это за такая штука-то — continuation passing style!» :)

                                мне остаётся лишь надеяться, что здесь ещё можно встретить людей, готовых самостоятельно жарить себе мясо и запивать его превосходным вином.
                                • +1
                                  Когда вы пишете о чем-то для публики, первейшее правило — сделать изложение структурированным, логически связным, наконец «филологически целостным». У вас все эти правила нарушены. Почему вы выбрали такую тему, зачем сразу начали какое-то перечисление, помесь русских и иностранных терминов и т.п. Да и мотивационная часть статьи отсутствует напрочь, соотв. предмет статьи туманен, а стало быть, мало кто будет его вдумчиво читать, кроме энтузиастов, которые скорее всего не расценивают Хабр как место обсужедния теории категорий, абстрактной алгебры и теории типов.

                                  Даже больше, уверен, что они понимают, что на хабр надо писать либо гораздо более развёрнуто, либо попроще. Не потому, что на хабре такие все глупые иждевенцы от IT, что далеко не так. Просто хабр — идеально место в первую очередь для популяризации чего-либо среди широких масс, не стоит превращать его в очередной клуб лямбдоидов, например. При всё моём уважении к ним.

                                  Можно минусовать, например.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      Вы ничего не поняли из того что я написал. Страшнее всего то, что вы не можете и не хотите понять, что я не имею претензий к самому автору и поднятую им тему не считаю несущественной или еще какой неправильной. Я обращаю внимание автора, что так для публики не пишут. Выше уже дали пример на правильное оформление своих мыслей.

                                      Вот автор признался, что у него нет высшего образования. Ну вот один из профитов от вышки как раз в том, что учат выражать свои мысли для других.

                                      А вы тут минусоидные войны устроили, «ах, не восхитились письменам про хаскелль, ах посмели заметить косяки в изложении». Нехорошо. Детский сад. 
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • –3
                                          Началось. «Если такой умный, сделай сам». Всё с вами ясно, юноша, вопросов больше нет.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                            • 0
                                              Причем здесь высшее образование? Причем здесь «понимаю»-«не понимаю»? Про возраст — ваша аргументация явно противоречит вашему возрасту, так сказать. Причем здесь ссылки и дебильный юмор? Вы намеренно переходите на личности, так как у вас кончились аргументы? Это уже не первый раз, но я не удивлён, если честно.

                                              Ваш автор святой? Непогрешим? Никакой критики быть не может? Или любая критика обязательно означает, что критикующий ничего не понимает, тупой и потому люто завидует? Вот отсюда и «старческий пафос». Ибо вы тут детский сад устроили, автору, вероятно, за вас стыдно.

                                              Область моих интересов лежит далеко за пределами хабра, поэтому я сюда ничего не пишу. Согласитесь, будет совсем неадекватно, если я внезапно начну писать сюда о рядах Фурье и прочем гармоническом анализе, причем сразу с каких-нибудь экзотических глав, и люто, бешено возмущаться, что меня никто не понимает? Ну и оформлю свой текст конечно как набор мыслей, не особо заморачиваясь о читаемости.

                                              Будьте проще, и прочитайте, наконец, то что я писал автору. Только нормально прочитайте, без «оскорбленного» апломба.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                • –3
                                                  Тявканьем? Я с вами не намерен больше разговаривать, хам трамвайный.
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                        • +6
                          Интересно, насколько больше людей теперь будут бояться хаскелля и обходить его стороной?
                          • –2
                            я не очень понимаю постановку вопроса

                            одни люди ездят в Турцию по системе All Included, другие — штурмуют восьмитысячники.

                            действительно, после прочтения неприукрашенного отчета о штурме пятитысячника первые в очередной раз укрепятся в мысли, что их выбор совершенно безопасен и неутомителен.

                            Но ведь штурмовать — интереснее, разве нет?
                            • +1
                              Если любителям Турции рассказать о том как хорошо штурмовать 8000-ки и как много в этом хорошего, то они хотя бы почитают о штурмах. Если сразу рассказать, что «когда я штурмовал 8000-к — я сломал обе ноги, шею и развёлся с женой», то врядли они будут в будущем обращать внимание на посты о штурме и вообще всё шевеление штурмующих.
                              • –3
                                ну и отлично

                                желающие штурмовать тем не менее всегда находятся.

                                да и тёлки им дают получше ;)
                                • –1
                                  вы крутой, чо. и как можно быть настолько крутым…
                                  • +1
                                    да ладно, мы не в детском саду.

                                    так я не понимаю Вашей когнитивной стратегии — Вы по всем изучаемым вопросам ждёте, чтобы изложение было «структурированным, логически связным, наконец «филологически целостным». »?

                                    Вы понимаете, что при этом обрекаете себя на вечное нахождение в арьергарде?
                                    • 0
                                      Вы не думайте за меня и за мои стратегии. Не обобщайте.

                                      Во-первых, любая статья/доклад/etc структурированно, логически и терминологически (так, видимо, всё-таки правильней) целостна (-о). Этому есть множество причин. Одна из них — когда пишеться тезис к докладу, либо статья, автор сам перерабатывает свои знания/результаты, структурирует их так, чтобы конечному пользователю (слушателям доклада, читателям статьи) было как можно более проще сразу начать мыслить совместно с автором. Это позволяет более эффективно достичь цели доклада/статьи. Так принято в научном мире.

                                      Во-вторых, любая статья имеет мотив, предпосылку и вопрос, если в ней нет результата (да и если есть, вопрос всё равно есть). У вас ничего этого нет, сразу гора фактов и предолжений, с неба.

                                      Вы вообще, мне представляется, путаете программистов и ученых от CS. Первые это инженеры; вторые, извиняюсь за тавтологию, ученые. Задачи у них разные, потребности тоже. Надо как-то обозначать о чем вы собираетесь вещать, а не с гордым оскорбленным видом жаловаться на Ultra-High level и «тут всё с этим плохо». Нехорошо. Никогда нельзя ставить себя выше читателя/слушателя.

                                      Это в кратце.
                                      • +1
                                        по-моему, мотивационная часть статьи находится в точности в её начале:

                                        Однако, мне кажется, что важно было бы озвучить, что всё то, что сейчас скрывается под именем «монада» — само по себе достаточно спутанно в плане педагогики и евангелизма. [...]
                                        Монады в настоящий момент являются миру как сложный ком из исторически обусловленных причин, проблем, решений, технических возможностей и теоретических основ (как алгебраических, так и аспектов теории вычислений).
                                        Все эти наслоения можно (и нужно) расщепить
                                        • +1
                                          Ну и где расщепление? Если вы взялись за педагогику, то ваша статья вообще контрпродуктивна, вредна. Я вам это как педагог говорю.
                                          • +1
                                            То что у вас там дальше это не расщепление, а поток сознания.
                                          • +2
                                            Вот человек недавно написал про монады:
                                            lisp-univ-etc.blogspot.com/2009/11/blog-post.html
                                            И написал так, что даже у меня появилось некоторое представление о том что это такое и для чего нужно.
                                            Вы можете в следующий раз писать так же понятно?
                                            Или автор той статьи тоже из преисподни?
                                            • +1
                                              > То, что в других языках представляет из себя единую ткань вычислений, в рамках Haskell разделено на 2 класса: чистые (обычные функции) и «грязные» (монады).

                                              это не так

                                              > Это приводит к разделению (дублированию) синтаксиса

                                              это не так. синтаксический сахар do здесь нерелевантен — некоторый монадический код легче пишется без него.

                                              > На практике же введение дополнительных правил приводит к тому, что появляется определенный предел выразительности языка и близости его к предметной области.
                                              > концепция монады, монадного трансформера и т.д. неимоверно далеки от любой предметной области, которая встречается при программировании, а абстрагировать их средствами Haskell не удастся.

                                              удивительные высказывания! просто удивительные. особенно поражает изобилие примеров, демонстрирующих ход мысли, ага.

                                              > Более того, само понятие вычисления, которое в других языках остается имплицитным, в Haskell'е достается на поверхность. Именно с этим, по-моему, связанны частые претензии к преувеличенной сложности Haskell программ.

                                              угу. давайте оставим вычисление имплицитным, и будем искать race conditions и deadlocks до посинения.

                                              > (вот, в С не было стратегии вычисления Exception, а в С++ появилась :)

                                              как это не было?
                                              • +1
                                                ну так напишите это автору статьи.
                                                Только вежливо :)
                                                • +1
                                                  зачем???
                                                  • +1
                                                    я не понимаю — то есть Вам все равно, что статья, из которой Вам «стало лучше понятно, что такое монады» — переполнена непониманием?

                                                    все равно она «лучше», чем то, что написано сверху?
                                                    • +1
                                                      Может, если вы укажите автору на ошибки он поправит статью или напишет новую.
                                                      Без обид, но у него лучше получается объснять теорию языком, который понятен простым смертным.
                                                      Видно, что у автора были проблемы с пониманием монад. И он действительно постарался написать статью для новичков понятным языком.
                                                      Я не могу судить о том насколько много ошибок в статье и насколько они критичны для новичка. Но люди будут учиться по статьям и книгам, которые им понятны. И если вы поможете исправить ошибки в таких статьях, от этого будет больше пользы, чем от той статьи, что вы написали на хабре
                                                      • +2
                                                        > Но люди будут учиться по статьям и книгам, которые им понятны.

                                                        ага. потом они будут лечиться по статьям которые им понятны (из газеты московский комсомолец).

                                                        потом они будут развивать науку по учебникам, которые им понятны (всю современную физику — в топку!)

                                                        ну в общем тоже позиция.
                                                        • 0
                                                          Скажите, а какую цель Вы ставили себе, когда писали эту статью?
                                                          • –1
                                                            структурировать понимание
                                                            • +1
                                                              Речь идет о том, чтобы понять то, откуда исторически появились монады? Но кому именно Вы хотели структурировать понимание? С какой целью?
                                                              • +4
                                                                ну мне самому такой текст очень бы пригодился год назад.

                                                                я уж не стал бы нос воротить.
                                                    • +2
                                                      прошу минусующего мои комментарии к этому блог-посту рассказать, ЗАЧЕМ он это делает :-\

                                                      • +1
                                                        Паре комментариев я минус поставил, так что отвечу за себя и остальных недовольных.

                                                        Если вкратце, то непонятно, для кого написана статья. Человек, знакомый с теоретическими основами монад, статью поймет, но она ему уже не нужна. А того, кто только пытается разобраться, статья разве что собьет с толку.

                                                        И не надо оправдывать непонятность статьи сложностью материала. Дураки, видать, были Перельман и Фейнман — физику излагали доступным языком. Только формулы на десяти листах — вот наш путь.
                                                        • 0
                                                          я не про вообще минусы — против них я ничего не имею

                                                          я про конкретно минусы моих замечаний к блог-посту lisp-univ-etc.blogspot.com/2009/11/blog-post.html, который якобы «всё понятно объясняет»

                                                          • 0
                                                            Вы вроде как ругаете автора за то, что он написал понятно, но неправильно. Ладно, нехороший автор. Не посвятил изучению Хаскелла десять лет прежде, чем написать статью.

                                                            А почему он вообще взялся за это дело? Не от того ли, что не нашел доступного объяснения от тех, кто таки эти десять лет именно тому и?
                                                  • +2
                                                    > Принято говорить, что, в целом, язык ленивый, а вся неленивость/энергичность (eagerness) находится (так и хочется сказать, заточЕна) внутри монад. Но дело в том, что любая Haskell-программа находится внутри монады IO. В итоге оказывается, что ленивыми в Haskell являются только чистые функции, а все вычисления (в понимании программистском), которых, на самом деле, большая часть — все равно остаются энергичными.

                                                    запредельная каша в голове, увы :(

                                                    я ж не обижаюсь, правда. здесь действительно написана каша.

                                                    при том что центральный тезис статьи (про то что монада — это стратегия вычисления) в общем верный.
                                          • 0
                                            Стоп-стоп-стоп. Тут вопрос не риторический. Либо Haskell — это восьмитысячник, и предназначен токмо для штурмования, то к чему это вся риторика, что теория категорий даёт базис, который помогает и т.д. и т.п.? А если Haskell — это инструмент, то как бы эта… Если он такой хороший, то чего ж им никто не пользуется почти?
                                            • +1
                                              я мог бы ответить на этот вопрос, но так как всё, что я скажу, можно прочитать где-нибудь в другом месте — то делать этого я не буду

                                              ну и опять же, понимания читателю не добавлю.
                                              • 0
                                                А где ж ваша страсть к покорению восьмитысячников :) Попробуйте, может быть, выйдет и знаний добавить, и написать так, что можно и не читать в другом месте.
                                    • +2
                                      Мозг свернулся в трубочку… нет, даже в бутылку Клейна.

                                      Автор, Вам удалось доказать, что Вы умнее всех. Если цель была такова — от души поздравляю:)
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • +1
                                          Алгол и С-подобные тоже не плохо описываются на языке математики. Вы, наверное, имели в виду, что хаскель синтаксически пытается следовать общепринятой математической нотации?
                                          • +1
                                            Хаскель, конечно, непростой язык, а монады — непростая концепция уже в самом Хаскеле. Ну и что? Это же не повод писать о них в стиле конспекта лекции по теоркату, понятного только самому пишущему, но уже непонятного даже не его соседу по парте…

                                            Теория баз данных — тоже строго математическая вещь, однако вполне описуемая человеческим языком.
                                        • +14
                                          • 0
                                            Спасибо, неплохо.
                                            • 0
                                              Спасибо за статью.

                                              Можете раскрыть понятие «мета-перехват вычислений»? Я-то думал, что классы типов предоставляют полиморфизм с перегрузкой.
                                              • 0
                                                ну полиморфизмы разные бывают

                                                я аналогов полиморфизму через typeclassы в других языках найти не могу

                                                в презентации Augustsson'а есть примеры, слайд 26 и 48
                                                • 0
                                                  пример Augustsson'а можно при желании переписать на C++ скажем.
                                                  • +1
                                                    вот пожалуйста тот же solve, только на С++

                                                    www.mraleph.info/files/haskell/solve.cpp.html
                                                    • 0
                                                      так это не совсем Embedded DSL

                                                      напишите функцию to_integer(), там будет обход AST и превращения типа case '/': return x / y; case '*': return x * y;

                                                      речь-то шла о том, что хаскель даёт доступ непосредственно к своему собственному AST.

                                                      хаскельное решение ближе к языку.
                                                      • +1
                                                        не-не-не, вы не просекаете фишку — зачем я буду писать функцию to_integer?

                                                        добавил в main использование solve от double.
                                                        • 0
                                                          кроме того, ваше утверждение что Haskell даёт доступ к своему AST не совсем относится к так сказать к теме: Haskell конечно его даёт (есть Template Haskell для метапрограммирования на уровне AST), но в данном конкретном примере AST совершенно не причем. Идёт обычная манипуляция значениями на обычном уровне программы, а не на метауровне…
                                                        • 0
                                                          а, я кажется туплю.

                                                          std::pair<T, T> solve действительно можно передать int в качестве T.

                                                          да
                                                        • 0
                                                          > я аналогов полиморфизму через typeclassы в других языках найти не могу

                                                          С++, специализация шаблонов, type traits.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                        • 0
                                                          Не ценит бескорыстный труд автора неблагодарное быдло, ох, не ценит.
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • 0
                                                              А разве не бывает содержательных и при этом внятных статей?
                                                            • +1
                                                              Таки для кого писал автор? Если для себя, то где приписка «дорогой дневник», если для людей, то почему бы не сделать так, чтобы люди могли прочесть и понять? А то чувствую себя как в студенческой в столовой по билетам из профилактория. Когда на жалобу о том, что еда плесневелая-гнилая получается ответ «Жрите, что дают».
                                                              Не, ну охота так писать — пусть пишет. Я ссылки почитаю, но если уж взялся, то почему бы не делать качественно?

                                                              btw Часть ссылок, например для 1. Guy L. Steele Jr. «Building Interpreters by Composing Monads» ведёт в пустоту. Да и вообще, разве было так сложно оформить нормально? Хотя бы те-же ссылки. (Это уже автору)
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                • +5
                                                                  Угу. Но можно было бы написать:
                                                                  Язык программирования Clean первым справился с тем, чтобы согласовать систему ввода-выводы с концепцией чистого ленивого языка. Сейчас всё, что не укладывается в чистоту и ленивость оформляется в виде эффектов: транзакции и их взаимодействие с вводом-выводом, генераторы случайных чисел, синхронизация при параллельных вычислениях.
                                                                  Все связи с внешним миром, а также вычисления, которые не укладываются в родную семантику языка (не ленивое вычисление аргументов функций, например) оформляются в виде эффектов.

                                                                  Такое разделение позволяет беспокоится только о четком и ограниченном подмножестве проблем. Ведь всё, что вне эффектов — это очень «простые» вещи, которые не могут «навредить» — там нет взаимных блокировок, не надо думать о барьерах и порядке вычисления.

                                                                  Подробнее об этом можно прочитать в: [а тут уже поставить список из ссылок.]

                                                                  Практически ничего не изменилось, но сразу стало понятно, что за неведомый Clean, убралась дурацкая аббревиатура, кроме того стала чуть более чётко написано что именно делают эффекты. Впрочем, это, возможно, только моё заблуждение.
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                    • 0
                                                                      Абсолютно не обязан. Так же как и остальные не обязаны тихо проходить мимо, а не высказавать свое мнение по этому вопросу. Я, в отличии от Вас, был бы благодарен за ту обратную связь (я, между прочим, тоже потратил свое время и поделился знаниями), которую мне бы дали, вместо проецирования ложных убеждений «ага, спорит, критикует, значит в теме не разбирается, недорос-с» на всех остальных. К слову, впору задуматься об этом, мы судим о других по себе.
                                                                • 0
                                                                  исправил PDF, спасибо!

                                                                  ну слава богу, ни плесневелого, ни гнилого, в этом тексте нет!
                                                                  вот придумают люди сравнение.
                                                          • –2
                                                            «interfaces в Яве» примерно тоже самое, что «slides в ПоверПоинте»)

                                                            «Проблема лежит в той же плоскости, что и называние стоящих перед тобой задач словом «stuff»»

                                                            Пост точно не с referats.yandex.ru заимствован?)
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                            • 0
                                                              Классная статья (Без воды, без вступлений). Не надо забивать голову всяким мусором. Понять что хотел автор можно просто прочитав статью.
                                                              Это статья для меня. Побольше бы таких «чистых» статей.

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.