Состояние монады что такое
Монада
Это статья о философском термине.
Монада (от греческого μονάς — «единица», μόνος — «один» [1] ), согласно пифагорейцам, обозначала божество, или первое существо, единицу или единое, как неделимое. Позже многозначный термин в различных философских системах Нового времени и современности, в психологии и эзотерике.
Содержание
История возникновения термина
…пифагорейцы проводили различие между монадой и единицей; монаду они принимали за мысль, а единицу — за число; и точно так же число два они принимали за арифметическое выражение, а диаду (ибо таково, видимо, то название, которое оно у них носит) — за мысль о неопределенном.
Гегель Г. В. Ф. Наука логики. — СПБ.: Наука, 1997. С. 191.
Этот же термин использовали и философы-платоники, в частности, такие неоплатоники, как Плотин, Порфирий, Ямвлих и другие, хотя неоплатоники чаще пользуются понятием Единое. Пользовались этим термином также представители других гностических течений, на русский язык термин гностиков обычно переводится, как Абсолют. Термин использовался также неопифагорейцами. У Никомаха первый бог ( монада) является демиургом. Демиург рождает диаду. Ум (др.-греч. Νοῦς ) же предстает как принцип бытия и познания всех вещей.
Современная философия
В Новое время термин «монада» позаимствовали из греческой философии такие философы, как Джордано Бруно, Лейбниц (его философия так и называется «монадология») и другие.
У Джордано Бруно монада является основной единицей бытия, в деятельности которой сливаются телесное и духовное, объект и субъект. Высшая субстанция есть «монада монад», или Бог; как целое она проявляется во всём единичном — «всё во всём». Эти идеи Бруно оказали определённое влияние на развитие философии Нового времени: идея единой субстанции в её отношении к единичным вещам разрабатывалась Спинозой, идея монады — Лейбницем, идея единства сущего и «совпадения противоположностей» — в диалектике Шеллинга и Гегеля.
В каждой монаде в потенциале свёрнута целая Вселенная. Лейбниц причудливо комбинирует атомизм Демокрита с различием актуального и потенциального у Аристотеля. Жизнь появляется тогда, когда атомы пробуждаются. Эти же монады могут достигать уровня самосознания (апперцепции). Разум человека — это тоже монада, а привычные атомы — это спящие монады. Монада обладает двумя характеристиками — стремлением и восприятием.
Последователем Лейбница в России был философ и математик Николай Бугаев. Бугаев под монадой понимает «самостоятельный и самодеятельный индивидуум… живой элемент…» — живой, поскольку обладает психическим содержанием, суть которого — бытие монады для себя самой. Монада для Бугаева — тот единичный элемент, который является базовым для изучения, поскольку монада есть «целое, неделимое, единое, неизменное и себе равное начало при всех возможных отношениях к другим монадам и к себе самой», то есть «то, что в целом ряде изменений остаётся неизменным». Бугаев в своих работах исследует свойства монад, предлагает некоторые методики анализа монад, указывает на некоторые законы, свойственные монадам.
Монада в эзотерических учениях
Хотя монада обозначает единицу, однако в оккультизме она часто означает объединённую триаду, Атма-Буддхи-Манас, или дуаду, Атма-Буддхи, ту бессмертную часть человека, которая перевоплощается в низших царствах и постепенно продвигается через них к человеку и затем к конечной цели — нирване (Теософский словарь).
Монады с точки зрения теории категорий
Мы начнём с простого введения в категории и функторы, затем дадим определение монады, приведём простые примеры монад в категориях и в конце приведём монадическую терминологию используемую в языках программирования.
Я уверен, что монады с точки зрения категорий почти элементарны.
Содержание
Категория
Категория состоит из объектов и морфизмов между ними. Термин «морфизм» не совсем корректен (он не обязан превращать что-то), по этому, часто, морфизм называют «стрелкой» для того, чтобы показать его абстрактную сущность.
Мы будем использовать термин «стрелка» во всех случаях, кроме того, когда стрелка обозначает некоторую функцию, тогда мы будем называть её «морфизм», но для меня он всё равно останется стрелкой.
Неважно, чем является объект или стрелка, важно только выполнение следующих свойств:
Замечание. В виду чрезвычайно абстрактной природы этой записи, мы не можем ожидать, что «все объекты» или «все стрелки из a к b» образуют множество. Категории, где они являются множествами называются «малые» или «локально малые».
Примеры категорий
Дополнительный материал
Образуют ли сами категории категорию? Да, но тогда нам следует дать определение стрелок между ними. Они являются стрелками второго порядка и называются функторами.
Функтор
Функтор отображает одну категорию в другую. Для того, чтобы сделать это, нам нужно отобразить объекты из первой категории во вторую и стрелки (морфизмы) из первой категории в стрелки второй категории непротиворечивым образом.
Примеры функторов
Упражнение. Определите такое же расширение для частичных функций.
Естественное преобразование
По этому оно называется «естественным» — оно действует непротиворечиво с действиями функторов на стрелки.
Примеры естественных преобразований
Опять же, это определение можно записать следующим образом:
Монада
Примеры монад
Помните, что мы можем считать частично-упорядоченные множества и их функции, сохраняющие порядок, как категории и функторы?
Эти два условия являются ни чем иным, как аксиомами монад, применёнными к частично-упорядоченным множествам, считая, что монады в частично-упорядоченных множествах и есть замыкания. Также можно попытаться применить это к частично-упорядоченным множествам путей графа.
Монады исключения и состояния
Монада исключения
Монада состояния
Скучное упражнение. Докажите, что это действительно монада.
Монады в программировании
Преимущество такой модели состоит в том, что мы можем погрузить все наши высказывания относительно программ в очень стабильную теорию категорий; возможно менять сущность объектов и категорий, изменять логику лежащего в основе топоса и быть на 100% уверенными в том, о чем мы говорим. Например, вместо «нечёткой логики» можно использовать интуиционистскую логику или семнтику Крипке.
Кажется, что некоторые техники программирования не подходят для такой модели, например исключения или побочные эффекты.
А для функций имеющих состояние подойдёт, соответственно, монада состояния.
Монада IO в Haskell
В Haskell ввели монаду IO, чтобы избежать сложности с описанием того, каким образом функции могут иметь побочные эффекты.
Они использовали следующий трюк. Возьмите монаду состояния, как мы делали до этого. Вообразите, что A это множество состояний, представляющее внешний мир, а X это множество результатов функции.
Интересно, чего же конкретно они пытались этим добиться.
Стадия монады: почему важно научиться комфорту в одиночестве (рассказывает психолог)
Сегодня я хотела бы поговорить с вами о стадии развития психики человека под названием «монада», о которой мало кто знает. Что это? Термин произошел от греческого слова «monados», что переводится как единица. Он был введен одним из величайших немецких философов Готфридом Вильгельмом фон Лейбницем.
У монады есть несколько различных трактовок, применимых в самых разных областях — от философии до программирования. О них мы говорить не будем, а вместо этого подробно остановимся на том, как монада определяется в семейной психологии.
От диады к монаде: основные стадии формирования человека
Фото Wayne Evans, pexels
Для начала представим себе еще не рожденного ребенка, который находится в утробе, и его жизнь полностью зависит от беременной женщины. Узнав о своем положении, она решает перейти в новую идентичность и стать матерью. Женщина рожает ребенка, и младенец оказывается полностью зависим от нее — она его кормит, успокаивает и обеспечивает безопасность.
Идет время, малыш растет, и в три года происходит триангуляция — в отношения матери и дитя для здорового развития ребенка должен вступить отец. В этот момент наш малыш начинает понимать, что мама принадлежит не только ему, и в этом мире существует папа, который проводит с мамой время наедине, когда вечером они закрывают дверь в свою спальню.
Данный переход — основа для нормальной сепарации ребенка. Без этого он останется в слиянческих отношениях с матерью, и в будущем есть риск, что большая часть его решений будет зависеть от того, одобрит их мама или нет. Став взрослым, ребенок, который не прошел стадию триады, может нуждаться в одобрении со стороны окружающего мира, и ему будет сложно найти себя. Но мы немного отвлеклись. До этого, я думаю, все было понятно.
Вот наш малыш достигает совершеннолетия, и ему пора «вылетать из гнезда». В этот момент перед ним встает одна из самых распространенных дилемм этого возраста: остаться с родителями, начать жить в одиночку, с друзьями или же с романтическим партнером.
Что такое монада?
Монада — это возможность жить с самим собой. Наш малыш, повзрослев, съезжает от родителей и начинает жить один. В этот момент образуются конструкты, на которые он будет опираться в дальнейшем:
У стадии монады нет возраста, кому-то необходимо находиться в ней больше времени, кому-то меньше, это зависит от разных причин, начиная от наличия детских травм, заканчивая любовью к одиночеству и уединению.
Только когда стадия монады ощущается как пройденная, можно задумываться о диадных отношениях с партнером и начинать строить здоровые семейные отношения.
Чем опасен пропуск стадии монады?
Фото Mikhail Nilov, pexels
Многие люди «перепрыгивают» стадию монады и сразу из родительской семьи переходят в диадные отношения. Так, в патриархальном обществе модель, при которой дети покидают отчий дом, лишь обзаведясь собственной семьей, считается традиционной, и сегодня она продолжает оставаться достаточно распространенной.
Поначалу все идет хорошо, и человек наслаждается жизнью со своим партнером, испытывая страсть, любовь и комфорт. Однако со временем может появиться ощущение, что что-то не так, как будто в отношениях не хватает воздуха, нет пространства, нет свободы.
Человек не может найти ответ на ключевой вопрос: «А чего я хочу?» И в этот момент он начинает обвинять партнера в том, что тот не дает ему развиваться, расти и жить. Однако дело вовсе не в партнере — смена возлюбленного не поможет решить проблему сепарации от родительской семьи, которая должна была произойти на стадии монады.
Избегание стадии монады также может иметь такие последствия, как:
И это только часть возможных негативных последствий при попытке формирования романтических отношений до качественного и полноценного знакомства с самим собой.
Как быть, если вы все-таки пропустили стадию монады?
Фото Samson Katt, pexels
Во-первых, не стоит отчаиваться — эту стадию всегда можно проработать. Если у вас нет отношений с сожительством, то стоит попробовать все-таки пожить одной и пройти стадию монады.
В ситуации, когда вы уже живете с постоянным партнером и понимаете, что не состояли в монаде, попробуйте обратиться к психологу-психотерапевту, который предложит терапию, в которой есть возможность прожить нечто подобное.
Если предыдущие варианты вам не подходят, то постарайтесь регулярно проводить время отдельно от партнера и детей — посещайте кино или кафе в одиночку, ходите по магазинам, смотрите сериалы или читайте. Одним словом, пробуйте проживать какой-то опыт как свой собственный, а не совместный с партнером.
Жизненный цикл семьи: стадия монады
Одной из важнейших отличительных черт системной семейной терапии является отношение к семье как к живому организму. А любой организм в своём развитии проходит через ряд обязательных стадий. Есть такие стадии и у семьи. И, с точки зрения системной семейной психологии, как бы это парадоксально не звучало, цикл развития семьи начинается со стадии монады, т.е. с того момента, когда вчерашний ребенок приобретает некоторую эмоциональную автономию, начинает принимать решения относительно своей жизни, руководствуясь своими собственными ценностями и идеями, а общение с родителями начинает происходить на уровне ВЗРОСЛЫЙ-ВЗРОСЛЫЙ.
Хорошо, если в это время молодой человек или девушка отселяются из родительского дома. Физический выход из поля родительской семьи облегчает сепарацию. (Несомненно, не последнюю роль здесь играет материальная составляющая. И это одна из причин, по которой отделение детей легче происходит в Америке, а у нас вполне себе традиционным является проживание в одной квартире представителей разных поколений.) Но физическое отселение не гарантирует сепарации, как и совместное проживание вовсе не отменяет ее.
Все детство, отрочество и юность ребенок включен в родительскую систему. Сепарационные процессы идут своим чередом, то ускоряясь, то замедляясь. Одним из важнейших факторов, определяющих возможность и успешность сепарации ребенка, являются хорошие отношения между супругами. Если эти отношения функциональные, если мужчина и женщина продолжают быть важными, ценными и значимыми друг для друга, если их жизнь не была сведена к ролям мамы и папы, то это создает хороший фундамента для отделения ребенка в самостоятельную единицу. Сепарация детей от родителей в норме занимает 3-4 года. При определенных обстоятельствах процесс сепарации может затянуться на всю жизнь и никогда не завершиться. Так бывает, когда родители включили ребенка в свои отношения, когда он стал некоторым центром притяжения для пары, тем элементом, без которого пара рассыплется. В этом случае, семейная система, подчиняясь закону гомеостаза, просто не выпустит такой важный элемент.
Итак, в общем смысле, процесс сепарации подразумевает готовность семьи к тому, чтобы отпустить своего члена за пределы семейной системы, и внутреннюю готовность ребенка, покидающего семью. Иными словами, «Я знаю, что я имею право опираться на собственные представления о жизни, руководствуясь своими принципами и идеями, а моя семья это право признает и относится ко мне как к равному себе Взрослому, имеющему право на свое мнение и на ошибку». При этом сепарация всегда сопровождается повышением уровня сепарационной тревогу у всех участников процесса.
Для выработки собственных принципов и идей нужно пространство и время. И родительский дом, как уже было сказано выше, не лучшее место для этого. В поле родительской семьи уже действуют свои правила и законы. Может они и хороши, но анализировать их и примерять на предмет пригодности для своей будущей жизни нужно на расстоянии. Научиться принимать важные решения, управлять своей жизнью и не потерять голову от обрушившейся свободы – та еще задача. Хорошо, если родителям хватило мудрости отдавать эту ответственность постепенно, шаг за шагом. Об этом проще написать, чем сделать.
Доверять ребенку, позволить ему совершать ошибки и помочь научиться извлекать из них уроки жизни, признавать свою неидеальность как родителя, да и как человека тоже, прислушиваться к потребностям ребенка, научить его любить мир и себя в этом мире – все это кропотливая работа, которая день за днем совершается мудрым и любящим родителем. И если фундамент для сепарации закладывался постепенно и своевременно, ребенку будет просто покинуть родительское гнездо и вступить во взрослую жизнь.
Бывает и так, что молодой человек (девушка) перепрыгивает стадию монады и сразу из родительской семьи ныряет в парные отношения, или на стадию диады. Задачи стадии монады, таким образом, остаются нерешенными. Чем это чревато? Тем, что, скорее всего, строить новые отношения он (она) будет по образу и подобию отношений в родительской семье, или исходя от противного. Но в обоих случаях не будет той осмысленности, осознанности, Не произошло знакомства с собой, не тем собой, который занимал некоторое место в родительской системе, а с собой отдельным. Не было возможности осмыслить родительские конструкты, правила поведения в социуме, паттерны взаимодействия… Весь этот груз остался не разобранным и не переосмысленным. Хорошо ли это? Однозначно – нет. Ответить себе на вопросы «Кто я есть на самом деле? Чего я хочу? Как я хочу жить?» придется рано или поздно, и лучше, чтобы это произошло раньше.
Монады с точки зрения программистов (и немного теории категорий)
Как узнать, что человек понял, что такое монады? Он сам вам об этом расскажет в первые 5 минут общения и обязательно попробует объяснить. А ещё напишет об этом текст и по возможности где-нибудь его опубликует, чтобы все остальные тоже поняли, что такое монады.
Среди функциональных программистов, особенно на Haskell, монады стали чем-то вроде локального мема. Их часто пытаются объяснить, отталкиваясь от частных случаев и сразу приводя примеры использования. Из-за этого слушатель может не уловить основную суть понятия, а монады так и останутся чёрной магией, ну или просто средством костылизации побочных эффектов в чисто функциональных языках.
Я сначала расскажу про базовые понятия теории категорий, а затем мы с практической точки зрения подойдём к определению монады и увидим, что на самом деле очень многие программисты пользуются этой мощной абстракцией в одном из её проявлений.
Моё изложение во многом основывается на книге Бартоша Милевски «Теория категорий для программистов», которая создавалась как серия блогпостов, доступна в PDF, а недавно вышла в бумаге.
Примеры приводятся на Haskell, предполагается, что читатель знаком с синтаксисом и основными понятиями языка. В упомянутой книге есть примеры и на С++, можете сравнить чистоту и понятность кода.
Категории
Определение
Категории сами по себе — очень простые конструкции. Категория — это набор объектов и морфизмов между ними. Морфизмы можно рассматривать как однонаправленные стрелки, соединяющие объекты. В общем случае про сущность самих объектов ничего не известно. Теория категорий работает не с объектами, а с морфизмами, точнее — с их композицией.
Используется следующая нотация:
В определении категории на морфизмы накладываются дополнительные ограничения:
Существуют два важных свойства, которым должна удовлетворять любая категория (аксиомы теории категорий):
Категории очень легко и естественно визуализируются как ориентированные графы. В принципе, любой ориентированный граф можно достроить до категории, добавив композиции морфизмов и тождественные морфизмы, если необходимо.
Объекты и морфизмы не обязательно образуют множества (в классическом смысле из теории множеств), поэтому в общем случае используется словосочетание «класс объектов». Категории, в которых классы объектов и морфизмов всё-таки являются множествами, называются малыми категориями. Далее мы будем работать только с ними.
Типы и функции
Композиция морфизмов — это композиция функций, причём синтаксис этой операции на Haskell почти идентичен математической нотации:
Рассмотрим несколько примеров типов с точки зрения теории категорий.
Множество из двух элементов — логический тип Bool :
Добавив тождественные морфизмы, получим следующую категорию:
В дальнейшем изложении будем использовать Haskell-подобную нотацию сигнатуры типов для обозначения морфизмов.
Функторы
Кроме того, должны выполняться «законы сохранения» композиции и тождественного морфизма:
Таким образом, функтор не «ломает» структуру категории: то, что было связано морфизмом в исходной категории, будет связано и в результирующей. Это верно и для крайних случаев, например, когда результирующая категория состоит из одного объекта и одного (тождественного) морфизма. Тогда все морфизмы исходной категории отобразятся в тождественный морфизм для этого объекта, но упомянутые выше законы нарушены не будут.
Посмотрим на эту картинку сильно издалека, так, чтобы сами категории превратились в точки-объекты, а функторы — в стрелки между ними (морфизмы). Получим категорию малых категорий, которая называется Cat (название периодически порождает сложные мемы с кошками).
Вернёмся к категории типов языка Haskell и будем работать с эндофункторами в этой категории. Они преобразуют типы в другие типы и, кроме того, каким-то образом преобразуют функции, работающие с этими типами.
Конструктор типа Maybe является примером такого функтора, он преобразует тип a в тип Maybe a (сам по себе Maybe не является типом!):
Монады
Все функции, которые были рассмотрены до этого, были чистыми, т.е. предполагалось, что у них нет побочных эффектов. Это функции в математическом смысле: результат чистой функции зависит только от значения её аргумента, он не меняется из-за места или времени вызова.
Поставим перед собой задачу логгировать вызовы функций. На императивном языке проще всего было бы хранить лог как глобальное состояние, которое изменяется в теле каждой функции. Программирование на функциональных языках не располагает к использованию глобального состояния, поэтому будем решать поставленную задачу, оперируя имеющимися у нас чистыми функциями — морфизмами в категории типов языка Haskell.
Типы функций позволяют составить их композицию:
Чтобы не отвлекаться на сложности реализации, в качестве представления лога возьмём просто строку. Мы хотим, чтобы после применения функции processString в логе содержалась запись «upCase toWords».
Запись в лог — побочное действие функций, мало относящееся к их основному функционалу. Хотелось бы во-первых, добавить информацию на уровне типов о том, что будет выполняться логгирование, и во-вторых, минимизировать дополнительные действия, которые придётся проделать сторонним разработчикам для работы с этими функциями.
Создадим новый тип данных, который будет помимо самих значений типа a хранить ещё и строку, в которую каждая вызванная функция будет добавлять своё имя.
Заметим, что Writer — это функтор, мы легко можем описать для него функцию fmap :
Преобразуем функции upCase и toWords и сделаем так, чтобы они возвращали значение, «завёрнутое» в тип Writer :
Теперь мы больше не можем записать композицию этих функций так же, как раньше, из-за несоответствия типов. Определим специальную функцию для композиции, которая сначала получает значение типа b и первую строку, передаёт это значение второй функции, получает значение типа c и вторую строку и в качестве финального результата возвращает значение типа c и конкатенацию строк, полученных при вычислении:
Реализация функции processString принимает вид:
Для того, чтобы получить настоящую категорию с такими морфизмами, необходимо определить ассоциативную композицию морфизмов и тождественный морфизм для каждого объекта таким образом, чтобы соблюдались аксиомы теории категорий. Тогда полученная категория называется категорией Клейсли, а функтор m — монадой. На Haskell это определение выглядит так (везде далее используются типы из категории Hask):
Например, для типа Writer реализация будет следующей:
Мы пришли к третьему определению класса Monad :
Здесь присутствует явное требование на то, чтобы m был функтором. Это ограничение не было нужно для предыдущих определений, поскольку функция fmap реализуется через >>= :
Практическое применение монад
Приведём примеры практического применения монад для решения задач, которые традиционно решаются с использованием «нечистых» функций и побочных эффектов.
Недетерминированные вычисления
Абстракция недетерминированных вычислений (т.е. таких, у которых может быть несколько возможных результатов) реализуется с помощью списков.
Тогда оператор >>= можно записать так:
Резюмируем эти реализации в классическом определении класса Monad :
Конечно, список как результат функции не обязательно обозначает недетерминированность вычислений. Хорошим примером, когда это действительно так, является реализация искусственного интеллекта для игр. Список может представлять возможные результаты хода игрока, ответных ходов может быть тоже несколько — всё время приходится работать со списками, списками списков и т.д.
Исключения
Простейшая реализация обработки исключений в чистых функциях состоит в добавлении в тип возвращаемого значения специального варианта, обозначающего, что что-то пошло не так.
Определение методов класса Monad для Maybe :
Для классификации ошибок можно использовать перечислимый тип или любую другую структуру данных, подходящую для конкретной задачи. Мы в примерах продолжим использовать просто строку. Введём синоним типа для работы с исключениями:
Композиция функций описывается аналогично случаю с использованием Maybe :
Определение экземпляра класса Monad уже не должно вызывать трудностей:
Состояния
Объявим синоним типа для работы с состоянием:
Фиксируем тип состояния s и покажем, что State s является функтором. Нам понадобится вспомогательная функция runState :
Реализация класса Functor :
Конечно, в реализации Unit можно опустить. Здесь он добавлен для того, чтобы показать эту операцию с точки зрения теории категорий.
Тип IO — один из первых, о котором узнаёт начинающий пользователь Haskell, и наверняка сразу встречает пугающее слово «монада». Такой упрощённый взгляд на этот тип как на состояние для работы с внешним миром может помочь понять, почему это так. Кончено, это описание очень поверхностно, но полноценный рассказ о том, как на самом деле реализован ввод-вывод, зависит от компилятора и выходит далеко за рамки статьи.