Монады и корреляция АОП? - PullRequest
0 голосов
/ 26 июня 2018

Я изо всех сил пытаюсь понять монады в функциональном программировании и как это применяется на языке, на котором я работаю (Swift, мультипарадигмальный язык).

Насколько я понимаю, Monad - это шаблон, предназначенный главным образом для решения двух задач программирования: операций цепочки при изоляции от нее сложности состояния (IO, log, error, неопределенность). Это правильно?

Думая об этом, кажется, что Monads можно использовать для обработки транзакционных / атомарных операций в функциональном решении. И мне показалось (в этом смысле) некоторое сходство с аспектно-ориентированным программированием: отделить управление сквозными задачами и его сложность от обычной бизнес-логики.

Имеет ли это смысл?

Спасибо!

PS: Вопрос не такой широкий, как «Что такое монада?».

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Трудно придумать краткое описание монад. У меня немного другой взгляд на вопрос, чем у @PaulJohnson.

В некотором смысле, да, вы правы насчет монад. Они позволяют объединять операции и управлять сложностью. Но существуют и другие механизмы для этого. Монады идут дальше.

Монады предоставляют «контекст», в котором могут выполняться вычисления. Они обеспечивают структуру и следуют некоторым определенным правилам. Эти правила распространены, но то, как отдельные монады следуют им, специфично для этой монады.

Например:

  • Монада Option определяет контекст, в котором данные, с которыми нужно работать, могут существовать или не существовать. Он подчиняется монадическим правилам, основанным на том, как они применяются к этому конкретному контексту.

  • Монада List определяет контекст, в котором они могут содержать ноль или более элементов данных, с которыми нужно работать. Альтернативный взгляд на монаду List состоит в том, что она предоставляет ноль или более возможных значений для работы. Вот почему обычно легко создать «перекрестный продукт» из нескольких списков на большинстве функциональных языков.

  • Монада Future (называемая по-разному на разных языках) определяет контекст, в котором данные для обработки могут быть недоступны.

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

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

Это действительно большая тема. Было высказано предположение, что не существует единственного (простого) ответа, который дал бы кому-то момент «ага», который им необходим, чтобы действительно понять монады. Вы должны сами пройти через борьбу, чтобы наконец «получить» ее. Не беспокойся об этом. Вы можете использовать монады, используя рецепты «поваренной книги», пока вы работаете, чтобы лучше понять их. В какой-то момент он щелкнет, и вы увидите, о чем идет речь.

Вы окажетесь неспособным объяснить их кому-либо еще. :)

Кстати, есть пара действительно хороших ресурсов, к которым я возвращался несколько раз, когда имел дело с монадами. Первое - замечательное видео Брайана Бекмана под названием Don't Fear the Monad . Вторая серия постов в блоге: Монады - слоны .

0 голосов
/ 31 мая 2019

С риском быть чрезмерно упрощенным; в world of Monads вы должны объявить свои Аспекты через систему типов. Таким образом, аспекты отслеживаются компилятором в явном виде, поскольку вы можете написать Monad, который обрабатывает транзакции или ведение журнала для вас.

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

0 голосов
/ 26 июня 2018

Монады - это объединение нескольких вещей в вычислительной технике, которые ранее рассматривались как отдельные. Когда я говорю «объединение», я имею в виду то же самое, что и физик: так же, как ньютоновская гравитация объединяла планетарные орбиты с земной баллистикой, а уравнения Максвелла объединяли электрические и магнитные поля, так и монады объединяли следующее:

  • Последовательность (сделайте A, затем B, затем C).
  • Обработка исключений (Выполните A. Если это не удалось, тогда выполните B).
  • Параллельная обработка (выполните A и B параллельно, затем объедините их результаты).
  • Недетерминизм (Выполните A. Для каждого возможного результата выполните B. Для каждого возможного результата выполните C).
  • Конечные автоматы .
  • Логическое программирование , а-ля Пролог.

И, возможно, еще кое-что, о чем я забыл. Как только вы поймете общую теорию монад, вы поймете, что она применима ко многим вещам, точно так же, как уравнения Максвелла открыли весь электромагнитный спектр, вместо того, чтобы мы думали, что свет и радио были двумя отдельными явлениями и, следовательно, не понимая, что были действительно интересные вещи между ними.

Одним из побочных эффектов этой общности является то, что вы можете писать свои собственные конструкции потока управления. Версии Haskell «while» и «for» не встроены, они являются частью стандартной библиотеки. Если вы хотите что-то другое, вы можете написать это.

Основными понятиями в монадах являются «связать» (т. Е. Оператор (>> =)) и «вернуть» (это действительно глупое имя, но мы застряли с ним). Есть несколько основных законов, которым они должны подчиняться. Грубо говоря, обеим операциям не разрешается делать что-то скрытое. Таким образом, «return» не может иметь побочных эффектов, а перестановка скобок в последовательной цепочке операций «bind» не может изменить смысл программы.

Это действительно абстрактный материал, поэтому он выглядит странно для программистов, воспитанных на традиционных императивных языках. Только когда вы поняли полдюжины различных монад, вы оцените фундаментальное единство концепции. Люди, изучающие Haskell, впервые сталкиваются с монадой ввода-вывода, потому что она нужна для «Hello World». В этот момент это выглядит как странный способ делать то, что делает любая другая программа. Это связано с тем, что монада IO является моделью работы любого другого языка программирования (кроме пролога); последовательность действий, влияющих на реальный мир, включая именованные места в физической памяти.

Большое преимущество монад Haskell состоит в том, что, в отличие от любого другого языка программирования, он не попадает в ловушку IO. Вы можете сортировать определения монад на других языках, но они по-прежнему выполняются в том, что Хаскелл будет считать монадой ввода-вывода. Поскольку Haskell чист, он позволяет вам избежать ограничений ввода-вывода и определить новые монады как истинные абстракции.

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