Что такое монады: заблуждение из мира Haskell

От переводчика: друзья, я не мог это не перевести. Кратко, ёмко и легко о наших любимых монадах. Вернее, об одном больном вопросе, связанном с ними.


В Haskell-сообществе существует проблема с монадами. Впрочем, нет, не совсем так. Позвольте я перефразирую: у Haskell-новичков существует проблема с монадами, и Haskell-сообщество частично виновно в этом.

Фундаментальная ошибка руководств о монадах

Все новички, пришедшие в мир Haskell, искренне желают “изучить монады”. Они тратят на это недели и даже месяцы, а потом бац! - и просветление снисходит на них! Поняв монады, они (что уже стало традицией) пишут статью в своём блоге, чтобы наконец-то объяснить миру, что же такое эти монады. К сожалению, подобная статья зачастую (и это тоже стало традицией) вводит читателей в заблуждение.

Знаете, во всём этом нет ничего нового. Эта проблема было поднята несколько лет назад в заметке “The Monad Tutorial Fallacy” за авторством Brent Yorgey. В той заметке Brent говорит то же самое, что собираюсь сказать я, но всё-таки, по моему убеждению, повторить сказанное нужно, однако чуть-чуть иначе. Главную тему той заметки можно выразить так: авторы “монадных руководств” не должны использовать те безумные аналогии, которые они обычно используют, ведь такого рода аналогии часто не помогают читателям. Однако существует и более серьёзная проблема.

«Что такое монады?»

Я полагаю, сам этот вопрос поставлен неверно. Многие Haskell-новички искренне убеждены: стоит им понять, что представляют собою монады, как они сразу же приобретут способность использовать их. И лично я считаю, что 99% людей, пытающихся изучить Haskell, подвержены такому убеждению. Да, для некоторых людей с математическим складом ума это может быть справедливо, однако для всех остальных (коих подавляющее большинство) это абсолютно не так.

Знаете на что это похоже? Представьте себе, что вы хотите научиться играть на музыкальном инструменте. И спрашиваете: “А что такое музыкальные инструменты?” Правда в том, что представление об устройстве того или иного музыкального инструмента не имеет никакого отношения к способности играть на нём. Если вы действительно желаете научиться играть на конкретном инструменте (будь то фортепиано, гитара, барабаны или губная гармошка), вы должны… учиться играть на этом инструменте. Если же вы просто узнаете, что представляет собою этот инструмент, это не наделит вас способностью играть на нём. “Ну да, у гитары есть дека, гриф, колки, струны… Хм… И чё?”

То же самое и с монадами. Знание о том, что они представляют собою класс типов с несколькими методами и тремя фундаментальными законами, не научит вас эффективно пользоваться ими. Вместо этого, изучайте конкретные монады. Поймите, как работают Maybe, и Either e a, и IO a, и [a]. Осознайте назначение оператора >>=, познакомьтесь с do-нотацией. И только изучив всё это, вы в действительности поймёте, как использовать монады. Спрашивать “что такое монады?”, желая научиться работать с ними - это столь же нелепо, как спрашивать “что такое музыкальные инструменты?”, желая научиться играть на них. Да, такой вопрос имеет смысл в самом начале вашего пути, но ответ на него не даст вам очень много.

Поэтому ваш вопрос никогда не должен звучать так: “Я чё-то не врублюсь в эти монады, помогите мне пожалуйста!”. Потому что это так же глупо, как спросить у гитариста: “Чё-то не пойму я эту гитару, объясни-ка мне!” Вместо этого спросите, например, так: “Я не пойму как работает оператор >>= в монаде Either e.” Вопрос, поставленный таким образом, в тысячу раз лучше.

Почему так происходит?

Я полагаю, причина в том, что некоторые Haskell-разработчики слишком уж восторжены в отношении классов типов. Да, классы типов великолепны, но они не являются “вещью в себе”. Они полезны и сильны лишь в контексте практического их применения, в языке и в библиотеках. И именно эта простая мысль часто забывается в пылу монадических споров.

А подоплёка мне ясна. Ведь это не очень круто сказать: “Я наконец-то понял, как использовать Maybe, Either, список, Reader и IO”. Гораздо круче заявить: “Я наконец-то понял монады!”. Однако, к сожалению, подобные заявления лишь вводят людей в заблуждение относительно монад.

Представьте себе, что все музыканты в мире начали бы говорить: “Я наконец-то понял музыкальные инструменты!” Согласитесь, подобные слова сформировали бы у непосвящённых людей совершенно неверное представление о музыкальных инструментах. Не поймите меня неправильно: знание устройства музыкальных инструментов - это чрезвычайно полезное знание, однако оно не имеет прямого отношения к мастерству игры.

Как же исправить эту ситуацию? Честно, я не знаю, можно ли это исправить. Однако мы можем донести до новичков простую мысль: монады подобны музыкальным инструментам, их много, они разные и играть на них следует тоже по-разному.