Haskell. Что такое монада?

программирование обучение haskell

Где-то около недели я пытаюсь осилить этот замечательный функциональный язык. Чистые функции, функции высшего порядка, каррирование, ленивость и пр. я ещё как-то сумел более менее адекватно понять. Но видимо как и большинство программистов, начинающих изучать Haskell, я столкнулся с огромной каменной стеной - монадой. Прочитав по нескольку раз статьи на habrahabr, у меня сложилось некоторое представление о том, что это такое. Но после того как я решил попробовать прочитать и понять теорию категорий в голове совсем всё перемешалось. Как вы представляете себе это абстрактное понятие без использования теории категорий? Можно ли сказать что это просто-напросто некоторый контейнер , в который можно закинуть тип данных, чтобы тем самым отделить чистые функции от функций с побочными эффектами?
Ответы:
Зависимость по данным - это когда в некоторой точке программы используется переменная, значение которой еще не присвоено. И этот кусок кода зависит по данным от другого куска, в котором данная переменная инициализируется некоторым значением.
Если мы имеем три функции, которые не зависят друг от друга по данным, то их можно выполнять в любом порядке (ленивые вычисления).
Но если одна функция выводит на консоль текст "Hello, ", вторая выводит на консоль "World", а третья - "!". Что будет тогда? Какая функция будет выполнена первой?
В "ленивых" языках, таких как Haskell, это не определено заранее, функции (если они не зависят по данным) можно выполнять в любом порядке, в результате можем получить: "World!Hello, ". Но это не то что нам нужно. Верно? Отсюда вывод: к функциям которые не зависят друг от друга по данным, но имеют побочные эффекты нельзя применять ленивые вычисления. OK, теперь остается об этом как-то сообщить компилятору.
И вот теперь - монады. Монада - это некий способ сказать компилятору в каком порядке нужно запускать те или иные функции, т.е. задать последовательность выполнения (и правила интерпретации результатов). Тем самым нивелируя ленивую природу языка.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.