И снова... Монада это моноид в категории эндофункторов!

8 ноября 2025

И снова... Монада это моноид в категории эндофункторов! hero image

Чем занимаются “нормальные” люди по выходным? Наверное бытом, отдыхом, я не знаю в общем!

Лично я по выходным большую часть времени естественным образом уделяю семье и быту, а все что остается на свои дела… ну, уже давно, и практически без дивиация все это время я инвестирую просто в “свои дела”.

Мои дела – это самообразование, исследования, написание постов в блог. 

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 мемная фраза а внатуре определение монады. Если его не запомнить, а хотя бы немного, ну вот хотя бы чуть-чуть понять о чем речь и что монады выражают… То можно и понять зачем это все, блин, надо :)

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

На резонный все еще вопросы – “ну хорошо, а надо то зачем?”

Как минимум затем, что способность видеть и понимать моноиды, категории и типы это, без приколов, прошивка мозгов которая позволяет моделировать (и создавать по этим моделям) более надежные и мощные системы!