И снова... Монада это моноид в категории эндофункторов!
8 ноября 2025
Чем занимаются “нормальные” люди по выходным? Наверное бытом, отдыхом, я не знаю в общем!
Лично я по выходным большую часть времени естественным образом уделяю семье и быту, а все что остается на свои дела… ну, уже давно, и практически без дивиация все это время я инвестирую просто в “свои дела”.
Мои дела – это самообразование, исследования, написание постов в блог.
tl;dr Сегодня я отдохнул классно! Кажется наконец понял смысл фразы “Монада – это моноид в категории эндофункторов.”
Смутное, разорванное представление у меня было до, но вот обьяснить к чему эти слова отсылают конкретно, ну или… хотя бы примерно я не смог.
В несколько итераций общения с sonnet 4.5 (Рефлексия, агентский поиск, и перепроверка с помощью LLM одно из лучших их применений) я прошел путь от:
бэээ, мэээ. Так, падажжи, давай разберемся отдельно и беспощадно, от самых базовых приципов в сферическом вакууме что такое монада, моноид, получше вспомним про морфизмы/функторы и эндофункторы… brrr погнали.
За первый присест до меня дошло что речь про, внимание категорию эндофункторов, и тут было мало понять что есть эндофунктор, но даже важнее понять базово что есть категория вообще.
В середине второго присеста я понял что такое моноид. Моноид это вообще самое понятное и простое что тут есть :)
Потом я пошел пересматривать отличный фильм Я - робот (оказалось что супруга его не видела, как так, подумал я и скачал совершенно легальным способом получил 2k версию в псевдо 4k апскейленом с помощью LLM! Мне показалось это очень уморительным.)
Короче, прервавшись от просмотра на укладывание сын спать, я удалился в свою келью и решил – поднажмем напоследок
Вот нередактированные начало этого моего последнего мышления письмом по теме:
ладно давай теперь с самого начала. я попробую своими словами написать все что я “понял”, а по существу скорее просто запомнил. Значит, монада. Монада это… АХАХХААХАА Монада это МОНОИД в КАТЕГОРИИ ЭНДОФУНКТОРОВ!!!! Монада сама по себе это алгебраическая структура на ЭНДОФУНКТОРE!!! И этот эндофунктор “РАБОТАЕТ” В РАМКАХ ОДНОЙ ИСХОДНОЙ КАТЕГОРИИ. НЕ категории эндофункторов!!!! Монада сама моноид потому что моноид это тоже такая алгебраическая структура в которой есть множество, бинарная операция и единичный элемент! В случае монады - множество это… множество из одного эндофунктора!?
А теперь попробуем чуть чуть разобраться, успокоиться и выдохнуть. Ничего же не понятно!:)
Значит есть у нас некая категория.
Что такое категория?
Категория это такая абстрактная структура в которой есть объекты и морфизмы между ними. У объектов самих по себе нет вообще никаких свойств - они максимально абстрактры. Все “свойства” объектов определяются и выражаются только тем какие морфизмы в них входят и выходят из них.
Короче, категория это объекты + морфизмы + композиция этих морфизмов + законы (требования к категории).
В категории еще есть так называемый “тождественный морфизм”, который по сути является нейтральным элементом, и… ничего не делает при композиции с другим морфизмом. Это важно.
Что такое функтор?
Функтор это морфизм между категориями. Вот как обычная функция отображает значения из одного множества (домена) в другое (кодомен), то функтор это тоже такая “мега-функция”, только отображает она не примитивные значения, а целые структуры (со свойствами и прочим).
Что такое эндофунктор?
Эндофунктор это такой функтор который замкнут в категории, результат его “работы” будет типом/объектом в той же категории.
Тут уже должно быть понятно что такое категория эндофункторов – говоря про категорию эндофункторов мы уже моделируем морфизмы между эндофункторами. Грубо говоря, категория эндофункторов это мета-категория по отношению к категории в которой “работают”/замкнуты элементы этой категории.
Моноид
Теперь разберемся с тем что такое моноид. Наверное – это самая простая штука здесь.
Моноид это просто алгебраическая структура которая представляет собой следующий “набор”:
- Множество значений
- Бинарная операция (это такая операция которая из двух элементов множества выводит какой-то другой элемент этого же множества)
- и нейтральный элемент, который “ничего не делает”
Ну вроде все понятно, осталась только та самая Монада.
То с чего я начал – “Монада - это алгебраическая структура на эндофункторе” не достаточно. В монаду еще “входят”:
Единица (Unit, η).
Это натуральное преобразование η: Id → T (из тождественного функтора в наш). Эта операция обеспечивает вложение чистого объекта A в его монадическую форму T(A). В коде это называется return или pure.
Умножение (Multiplication, μ).
Это натуральное преобразование μ: T² → T, которое схлопывает два уровня монадической структуры в один. Композиция T ∘ T → T является базовой базой. То, что она работает для любого количества уровней Tⁿ → T, обеспечивается ассоциативностью и самой “функторностью” T.
Но и этого еще не достаточно, потому что чтобы тройка из эндофунктора, единицы и умножения считалась монадой она должна удовлетворять трем аксиомам МОНОИДА (пу-пу-пу! вот сюрприз):
Ассоциативность.
Ассоциативность легко понимается через школьную математику:
(a × b) × c = a × (b × c)
Для функторов это значит, что от порядка схлопывания уровней результат не меняется: схлопывание внутренних двух слоев, а затем внешнего слоя (μ ∘ Tμ), должно быть равно схлопыванию внешних двух слоев, а затем внутреннего слоя (μ ∘ μT).
Левая единица и Правая единица.
Помните нейтральный элемент в моноиде? Так вот для элемента a из моноидального множества M, где e — это нейтральный элемент (единица), левая/правая аксиомы это:
e · a = a
a · e = a
На уровне монады “нейтральный элемент” e заменяется операцией η (заворачивания), а бинарная операция · заменяется μ (схлопыванием).
Левая единица требует, чтобы схлопывание после заворачивания (μ ∘ ηT) было тождественным преобразованием. Правая единица требует, чтобы заворачивание с внутренней стороны, а затем схлопывание (μ ∘ Tη), также было тождественным преобразованием.
Все. Монада — это эндофунктор T, которому мы дали структуру моноида (T, μ, η).
Зачем это все надо блин!?
Ну во первых, для того чтобы понять, что
Монада – это моноид в категории эндофункторов
Это не cryptic мемная фраза а внатуре определение монады. Если его не запомнить, а хотя бы немного, ну вот хотя бы чуть-чуть понять о чем речь и что монады выражают… То можно и понять зачем это все, блин, надо :)
Хотя категории, типы, монады и моноиды это штуки из абстрактной алгебры, а в программировании они как правило присутствуют в явном виде в языках чуть ли не эзотерических, чем прикладных… В не явно виде и монада, и моноид, и категории с типами могут быть найдены и смоделированы практически везде. Особенно в программных системах!
На резонный все еще вопросы – “ну хорошо, а надо то зачем?”
Как минимум затем, что способность видеть и понимать моноиды, категории и типы это, без приколов, прошивка мозгов которая позволяет моделировать (и создавать по этим моделям) более надежные и мощные системы!