Pull to refresh

Comments 47

UFO just landed and posted this here
Да, ассоциативность — сочетательность, свойство бинарной операции, при котором результат последовательного применения операции не зависит от расстановки скобок:
(h ∘ g) ∘ f = h ∘ (g ∘ f) = h ∘ g ∘ f
где используются следующие морфизмы:
f: A → B, g: B → C и h: C → D

Все 3 композиции обозначают одно и то же: A опосредованно знает D.

Вам намекнули, что "A опосредованно знает D" — это уже не ассоциативность, а транзитивность, которая вообще не про скобки. А вот что Вы подразумеваете под отношением "знает" и как его транзитивность следует из ассоциативности композиции функций или наоборот — это уже загадка.

Спасибо за комментарий, опишу это немного подробней. Согласен, что момент с транзитивностью тут не очень раскрыт. Не хотел усложнять описание.

На рисунке ниже нарисованы 4 человека (или их страницы вконтакте — не суть важно): Иван, Я, Мария, Алёна. Пётр нас в данный момент не интересует.

image

Пусть этот гипотетический Иван знает меня, неважно, в реальной жизни или в сети. Т.е. под отношением «знает» я подразумеваю именно то, что один человек знает другого. Пусть Я знаю гипотетическую Марию. Причём, если речь идёт, скажем, о теннисистке Марии Шараповой, то, скорее всего, она меня не знает, поэтому морфизм от неё ко мне не рисуем. Пусть Мария знает некоторую Алёну — рисуем ещё один морфизм.

Итого получается цепочка: Иван знает меня, Я знаю Марию, Мария знает Алёну.

При этом Иван опосредованно знает Марию через меня. Также Иван опосредованно знает Алёну через меня и Марию. Я опосредованно знаю Алёну через Марию. В отношение «опосредованно знает» я не вкладываю какой-то больший смысл, на интуитивном уровне это отношение вполне понятно: один человек знает кого-то, кто знает другого человека. Хотя, блин, я согласен, что в реальной жизни отношение «опосредованно знает» не используется и какое-то не очень интуитивное.

Будем считать, что в нашем примере один человек знает другого именно в реальности. Пусть я видел Марию Шарапову не только по телевизору, но, скажем, брал у неё автограф и жал ей руку. А, вот, Ивану так не посчастливилось. Но он может тешить себя тем, что знает Марию через два рукопожатия, а Алёну — через три.

Транзитивность отношения «опосредованно знает» нас в данном случае совершенно не интересует, поэтому я и не говорил о ней в статье. Для нас важно то, что следующие высказывания
«Иван через меня знает Марию, которая знает Алёну.»
«Иван знает меня, который через Марию знает Алёну.»
обозначают одно и то же:
«Иван через меня и Марию знает Алёну.»

Т.е. в этой цепочке «знания» можно группировать морфизмы (расставлять скобки) как угодно — всё-равно результат будет один.

Свободная категория, на мой взгляд, существенно сложнее категории множеств. Этот пример я привёл просто для затравки. Совсем серьёзно свободные категории мы в этом цикле скорее всего не будем рассматривать. И у более простых категорий есть интересные применения.

Спасибо за ответ. Теперь стало понятнее, что Вы хотели донести.

Почему не использовать синтаксис es6? Код сократился бы раза в 2.


И через typeof тип проверять не стоит:


function A() {}
class B {}

let a = new A();
let b = new B();

typeof a; // => "object"
typeof b; // => "object"
Спасибо! С typeof я тупанул, исправил.

Изначально не использовал ES6, потому что писал всё это преимущественно в 2013-ом году. Сейчас не стал переписывать, потому что по хорошему надо всё это разложить по модулям и существенно иначе организовать код. Но сейчас этим заниматься слишком рано, пока не реализованы более сложные категории.

С другой стороны, в том же d3.js не используются лямбды, классы и т.п. Разве что только модули. В общем, я согласен, что стоит переписать на ES6, но хочется поднакопить ещё категорий и сразу переписать нормально.
хочется поднакопить ещё категорий и сразу переписать нормально.

Раз так, очень советую писать на Typescript. Типы там конечно только во время компиляции живут (после компиляции всё становится обычным JS с его правилами), но, тем не менее, плюсов у TS намного больше, чем минусов, и его изучение окупится. Вот, например, доки с продвинутым использованием типов. Там и дженерики, и объединения типов, и другие плюшки.

Статическая типизация — это отлично, но, на мой взгляд, её недостаточно. В развитии языков программирования сейчас общая тенденция — брать из одних языков какие-то идеи, которые были придуманы десятилетия назад, и реализовывать эти идеи в других языках программирования. Так появился TypeScript, были добавлены Set, Map, лямбды, модули в ES6. Хорошо, что языки развиваются, но печально, что копированием совершенно тривиальных идей.

Мне, как и разработчикам ES6 или TypeScript, не нравились некоторые особенности JavaScript. Но я планировал усовершенствовать JavaScript не просто добавлением статической типизации или коллекций, а созданием некоего CategoricalScript, основанного на теории категорий. На начальном этапе он может быть реализован просто в виде набора функций, написанных, на JavaScript. В будущем для него может быть запилен какой-то специальный синтаксис, но это не принципиально.

Например, язык Charity (ещё тут и тут) полностью основан на теории категорий. На мой взгляд, это качественно новый уровень по сравнению с остальными языками программирования.

Короче, эта библиотечка решает задачи аналогичные тем, которые решает TypeScript и т.п., но качественно иначе. Как именно она реализована уже вторично. Изначально хотелось сократить количество лишних прослоек в виде TypeScript и т.п., но в будущем будет виднее.
Похоже на Haskell, который компилируется в JavaScript. В Haskell для меня слишком мало теории категорий, я хочу что-то такое.

Да, он по мотивам Haskell. Насчёт "мало ТК в Haskell" у меня возникает вопрос: Вы хотите много теории категорий в языке, чтобы что? Какой-то практический смысл в этом будет? Или просто just for fun эзотерический ЯП создать?

Чтобы лучше разобраться в теории категорий. Я прочитал первую книгу по ТК лет 15 назад, и только через 10 лет, когда попробовал реализовать какие-то категории в коде, начал что-то понимать. Возможно, это поможет ещё кому-то разобраться в ТК.

В Haskell реализована одна категория Hask, в которой объекты — типы, морфизмы — функции. А, скажем, категория множеств или графов в нём из коробки не реализованы. Они нам понадобятся в следующих статьях для написания одного приложения. Мне мало осознания того, что, например, полиморфные функции в Haskell — это типа естественные преобразования и т.п. Всё-равно они остаются полиморфными функциями. А я хочу собрать какое-то осмысленное приложение полностью в терминах ТК. Чтобы в нём не было функций, классов, типов, а были только категории, функторы и т.п., чтобы все задачи на унификацию чего-то были описаны как коуравнители или кодекартовы квадраты в некоторой категории, чтобы все задачи на поиск оптимальной структуры описывались через универсальные свойства и т.п. Иными словами, хочу, чтобы не просто какие-то конструкции ЯП можно было бы описать в терминах ТК, а чтобы само приложение было написано в терминах ТК. Короче, в Haskell есть конструкции, которые типа из ТК, но всё-равно приложения пишутся в терминах функций, типов, классов, а не ТК.

Если получится всё приложение разложить на категории, пределы, универсальные свойства и т.п., то можно попробовать запилить под это ЯП, в котором уже не будет типов, функций, классов, а будут только категории, пределы,… Все привыкли к тому, что в ЯП есть функции, типы. А я хочу сделать ЯП, в котором будет что-то принципиально другое.

Не факт, что это получится, пока просто пишем приложение, о котором расскажу в следующих статьях, и разбираемся в ТК.
хочу, чтобы не просто какие-то конструкции ЯП можно было бы описать в терминах ТК, а чтобы само приложение было написано в терминах ТК. Короче, в Haskell есть конструкции, которые типа из ТК, но всё-равно приложения пишутся в терминах функций, типов, классов, а не ТК.

Для меня это выглядит логичным, потому что программисты, может быть за редким исключением, не мыслят в терминах теории категорий при разработке программы.
Но в любом случае, успехов Вам, может правда кому-то пригодится и такой ЯП.

Спека для JS (аналог для ФП в haskell)
Спасибо за ссылку! Очень интересная штука. Хотя там и не говорится явно о теории категорий, но по смыслу это пересекается с тем, что я пытаюсь сделать. За большинством конструкций, которые у них реализованы стоят различные категории, но библиотека реализована без явного их выделения.
ну в хаскелл это категория Hask, где объекты это типы, а морфизмы это ф-ции
Написано очень приятно, спасибо. Я простой трудяга на javascript. И даже когда-то (давно) на математика учился. Наверное я всё это изучал, и возможно в приложениях (к каким-нибудь задачам о ранцах), но вот кроме «вау!» и «скажите, так и стенку в магазине можно убрать?» после прочтения сказать пока по существу не могу. Не улеглось.

Я вот за что математику люблю. За то, что если удалось какую-то человечески-сформулированную задачу поставить на математическом языке, то путем применения лемм, теорем и следствий мы имеем ответ (сначала на математическом, а затем и уже на человеческо-сформулированном).

Вот чувствую же что с теорией категорий можно всё, но без человеческой задачи сложно весьма. Вот смотрите, из практики. Есть множество товаров. «Морфизм» (?) для товаров — взаимодополняющие. Это категория, так как ассоциативна, и будем полагать что товар сам себя дополняет. Что можно из этого «заиметь бесплатно» с теорией категорий в руках?..
Вы задали слишком сложный для меня вопрос. На сколько я понимаю, для взаимодополняющих товаров решаются различные минимаксные задачи, например, на поиск оптимальной потребительской корзины. Наверное, можно сформулировать подобные задачи на языке теории категорий, но я не достаточно хорошо в этом разбираюсь.

Что касается категории товаров. Можно каждый товар рассматривать как отдельный объект и мы получим свободную категорию. Но не уверен, что это удачный взгляд. С другой стороны, можно рассматривать категорию товаров как категорию отношений. Например, в этой категории будет объект { Автомобиль, Шина, Бензин, Силикон (для чернения шин), Телефон, Планшет, Внешний аккумулятор } и эндоморфизм на этом объекте, который является следующим отношением: { (Автомобиль, Шина), (Шина, Силикон), (Автомобиль, Бензин), (Телефон, Аккумулятор), (Планшет, Аккумулятор) }.

Причем, повторюсь, что такая категория будет именно категорией отношений, а не множеств. Потому что приведенный морфизм является отношением, а не функцией — он сопоставляет автомобилю два значения: шина и бензин.

Что делать с этой категорией дальше — я не знаю :) У меня есть практический пример использования теории категорий, я планирую его описать в одной из следующих статей, но он немного из другой области.
Спасибо, буду следить за обновлениями. Взаимодополняющие товары, про оптимум вы отличную идею подали, чаще всего их кластеризуют (по ART1 или что-то по типу).

И вот лично что я увидел увидел в теории категорий, так это потенциал к AI-вычислениям, например, не так давно я баловался с F# и генетическими алгоритмами поиска действий, переводящих систему из точки А в точку В. Но генетические алгоритмы ненадежны, сами понимаете, random — а ему особо не доверишь чувствительные вопросы, даже на моих простецких модельках результаты зависели «от погоды на Марсе» — от тупо запуска программы. Так вот… теория категорий… оно ж решает уравнения. Уравнения относительно произвольных объектов, а объектом могут быть и математические, и любые другие операции. Вобщем задали вы мне материал для размышлений, даже как отвлекаться на обычную работу теперь не знаю :)
Да вот наверное отвечу сам на свой вопрос. Похоже, как и обычно в математике с этим дело обстоит, с подъемом по абстракциям теряется релевантная для практических задач информация («предел всех рефлексий — я мыслю», или «где я нахожусь? — на воздушном шаре!»).

Сидел весь вечер с двумя примерами: дерево KPI предприятия и действия, условно, какой-нибудь единицы на поле боя. Если вершина, так выражусь, теории категорий — это уравнители, то никакой особо полезной информации, кроме того что «могут существовать эквивалентные порядки», мы похоже не получаем.

Возвращаясь к нашим товарам, можно размножить сущности на уровень ниже: у товаров есть свойства. Соответственно, операция «товар дополняет» должна сохранять какие-то соотношения у свойств. Наличие уравнителя бы означало бы, что, ну нет, не масло масляное, но близко к тому — «удочки хорошо идут с джипами». Вроде хорошо, только беда что утверждение имеет место с точностью до изоморфизма, коих может быть более чем континуально (ну не на конечном множестве естественно, а на конечных там всё вырождается в тривиальщину — в случае с KPI, а в случае с каким-нибудь танком — там бесконечность решений).

Хотя может я и неправильно всё рассудил.
Пока что...

Перечитал статью. Не подскажете, а продолжений ждать? «Уже джва года жду!». Если честно, со второго раза вдумчивого чтения куда более понятно, и оказывается проще чем думал изначально.

Раз уж пишу ответом на свой бестолковый коммент чуть более чем полугодовалой давности, кое-что скажу и по поводу своих примеров.

Дерево KPI. Имеем несколько множеств индикаторов. Пусть каждое множество отражает некоторый аспект (без кавычек, в менеджменте это и есть аспекты, финансовый, рыночный, внутрикорпоративно-персональный, и другие). Морфизм — «показатель влияет». Навскидку, уравнитель даст множество «корневых» индикаторов — тех, которые определяют поведение всей системы.

Поле боя. Пусть есть множества боевых единиц двух враждующих сторон (разных родов войск). Морфизм — «может подбить». Аналогично, предел — множество единиц, которые всех могут подбить.

Что касается «AI и прочих умных и красивых обезьянок». Теория категорий в изложенном виде как мне видится может быть чертовски полезна в анализе (кластеризованных) событий с морфизмом «является причиной».

Ну вобщем захотелось написать свой теор-велосипед :) Спасибо еще раз за статью!
Раз затронули монады, то было бы не плохо покрыть категорию Клейсли и стрелки Клейсли
Есть еще https://www.youtube.com/playlist?list=PLwuUlC2HlHGe7vmItFmrdBLn6p0AS8ALX и https://jscategory.wordpress.com/
Спасибо за ссылки! Особенно последние статьи у них достаточно клевые. Ну, я, по крайней мере, постарался добавить во всё это немного больше наглядности и больше внимания уделил универсальным свойствам. В большинстве статей они воспринимаются как что-то очевидное и само собой разумеющееся, хотя это не так.

До категории Клейсли я дойду наверное не очень скоро. Ей везде уделяют очень много внимания. А более простые и, на мой взгляд, важные вещи (типа глобальных и обобщённых элементов) обходят стороной или рассматривают вскользь.
Функторы прикольно покрывать когда есть обобщение про 2-категории (они там как морфизмы)
Кстати у меня есть такой список, тут есть и про ТК https://github.com/xgrommx/awesome-functional-programming
Еще от того же Бартоша https://www.youtube.com/watch?v=I8LbkfSSR58&list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_
Выводы 1, 2 очень спорные:
«она помогает правильно организовывать код, правильно называть классы и функции.»- да, ладно. Вы вкладываете в смысл организация кода явно не структуру файлов, каталогов и тд.
и про название классов и функций тоже мимо.
«Во-вторых, теория категорий позволяет писать универсальные алгоритмы» — универсальные для чего? Может он один универсальный алгоритм-то… Или если он не один, то почему они все универсальные…
Практического приложения не хватает очень…
Спасибо за комментарий. Я постараюсь продемонстрировать универсальность во 2-ой или 3-ей статье про категорию графов. Там будет видно, что одни и те же алгоритмы применимы хоть для множеств, хоть для графов.

Практическое приложение планируется в самой последней статье цикла.
Я очень люблю такое описание, к чему приводит ТК (про уровни абстракции и ТК это пока крайняя степень абстракции)

Самая простая абстракция — это переход от «двух яблок», «двух камней» и т. д. к понятию числа 2; переход от «я повернулся боком», «камень повернулся боком» к понятию поворота на 90°. При этом манипулирование предметами заменяется на универсальные законы работы с числами (или с преобразованиями, или с чем-то еще).

Абстракция следующего уровня возникает, когда понимаешь, что правила обращения с числами 2, 3, 15 и т. д. по сути одинаковы. Все эти числа можно складывать, перемножать, для них работают переместительный, сочетательный и другие законы. Иными словами, все целые числа «играют по одним правилам». Поэтому часто полезно оперировать не с конкретными числами, а с новым математическим объектом — кольцом целых чисел. Аналогично, разные повороты предмета в пространстве являются элементами нового математического объекта — группы трехмерных вращений.

Третий уровень абстракции — это когда исчезает «осязаемость» элементов групп, колец, полей. Тут уже рассматриваются не конкретные группы вращений или иных преобразований, а просто абстрактные группы — совокупности элементов со строго очерченными свойствами. Здесь на первый план выходит то, какова структура группы, а не то, из чего она «состоит». Свойства всевозможных непротиворечивых математических структур, безотносительно к тому, где именно эти структуры возникают, изучает абстрактная алгебра.

Теория категорий предлагает подняться еще выше, на четвертый уровень абстракции. В ней изучаются уже не конкретные группы, а сеть математических взаимосвязей между разными группами. Аналогично, изучается сеть взаимосвязей между самыми разными типами пространств или между самыми разными кольцами. Более того, оказывается, что эти сети взаимосвязей (групп, полей, пространств и т. д.) — очень шаблонны. Между ними (между сетями!) можно установить параллели, и с помощью этих параллелей высокого уровня иногда удается решить очень трудные, но вполне конкретные задачи.
UFO just landed and posted this here
Класс, интересно было прочитать, хм хотя я в жизни не интересовался программированием, признаться половину них не понял, но прочитал, может автор умело преподнес текст.спасибо интересно
При этом, не будучи Георгием Перельманом...

Видимо, имеется ввиду Григорий Перельман.
Исправил, я раз на пятьдесят вычитывал статью, но всё-равно остались ошибки, рад, что вы прочитали :)
Я еще не читал, а только просматривал… Спасибо вам за такой труд ).
Спасибо за статью — интересно и доступно написано. и очень классная иллюстрация — хэллоуинский настрой:)
Насчет отображений в пустое множество из непустого: их нет, как вы и предполагали. Объяснение такое: для каждого x из области определения f(x) должна быть элементом области прибытия (кодомена), а у нас в кодомене ничего нет (если область определения X не пуста, то какой-то x в ней взять можно). Формальнее (все равно не доказательство): функция из X в Y — это такое множество пар (x,y), т. е. подмножество декартова произведения X на Y, что для каждого элемента из X есть ровно одна пара, его содержащая. Произведение пустого множества на что угодно является пустым множеством, его единственное подмножество — оно само. Тогда из пустого множества X у нас есть пустое отображение в произвольное Y: поскольку в X ничего нет, то «для любого x из X что-то выполняется» всегда верно. А вот если X непусто, а Y пусто, то никакого шанса найти для какого-то x из X пару (x,y), где y — элемент пустого множества, у нас нет.
Спасибо, теперь понятно! Правда теперь я загрузился ещё сильнее. В категории множеств функции можно рассматривать одновременно как морфизмы и как объекты (множества пар). С другой стороны, в категории множеств совершенно неважно множество ли это пар или чего-то ещё, для любого множества пар можно найти изоморфное ему множество чего угодно. Или, наоборот, для любого множества не пар можно найти изоморфное множество пар (или функцию).

Получается, что в категории множеств класс объектов и класс морфизмов совпадают? По крайней мере, с точностью до изоморфизмов. Интересно, есть ли какое-то строгое описание всего этого. Это похоже на какой-то частный случай леммы Йонеды или непонятно что.
Ну, я не эксперт в теории категорий, поэтому могу наврать. Сам по себе факт, что стрелки категории являются в то же время и ее объектами, не исключителен: вот если вы Мак Лейна откроете, то дискретную категорию он именно так и вводит: там класс морфизмов совпадает с классом объектов (потому что ничего, кроме тождественных морфизмов и не нужно). Я (очень возможно, по невежеству) ничего особо интересного тут не вижу, честно говоря, потому что математику поставили на теоретико-множественный фундамент, и «все есть множество» (включая и отображения между двумя множествами) в математике скорее банальность (которая некогда была великим прорывом, само собой).
Получается, что в категории множеств класс объектов и класс морфизмов совпадают? По крайней мере, с точностью до изоморфизмов

Именно что с точностью до изоморфизма, то есть сами классы не совпадают. А морфизмы нужны, чтобы композицию из них делать, и тут мы нужную для этого информацию безнадежно теряем. Как сюда Ионеду воткнуть, тоже не очень видно, потому что там все про hom-множества, а не про их отдельные элементы. Может и можно как-то проинтерпретировать, при желании.
В разделе «Пример свободной категории» есть неочевидная двусмысленность. Вопрос: есть ли из «Я» в «Я» морфизмы помимо тождественного? Судя по тому, что пишет о свободных конструкциях Милевский, есть, причём бесконечное число. А вот для предпорядка будет только один, соответственно, предпорядок в общем случае не свободный.
Дело в том, что в данных категориях от некоторого объекта A к некоторому объекту B может идти максимум один морфизм.

Получается, что нет.
Спасибо! Добавил уточнение, что речь идёт именно о свободной категории, порождённой графом. В которой, в общем, случае действительно может быть произвольное количество морфизмов между парой объектов. Но в рассмотренном примере в графе, на основе которого строится категория, максимум одно ребро между вершинами, поэтому максимум один морфизм.
Не совсем так. Ребро-то одно, но в данном случае морфизмы это пути, а не ребра. Из «Я» в «Я» кроме тождественного пути, будут пути «Я» -> «Иван» -> «Я», «Я» -> «Иван» -> «Я» -> «Иван» -> «Я» и т.д. Поскольку категория свободная, вы не можете их склеивать вместе.
Спасибо! Кажется теперь я окончательно понял. Я понимал, что морфизмы — это пути, но не задумывался о том, что в путях могут повторяться узлы. Тут и тут в явном виде не говорится, что узлы могут повторяться. Скорее даже, наоборот, из формулировок, которые они проводят, можно сделать обратный вывод. Хотя, раз это явно не запрещено, значит разрешено. Для моноидов, действительно, подобные цепочки играют важную роль. Но для свободной категории, порождённой графом, не очень понятно дают ли они что-то полезное.
UFO just landed and posted this here
Спасибо за добрые слова! Я не знаком с этими теориями и не на столько хорошо разбираюсь в математике, чтобы ответить на ваш вопрос. Немного почитал эти книги. Сходу вникнуть не получилось, нужно больше времени. Выглядит довольно интересно. На сколько я понял, декартиан — это декартово произведение множеств, а булениан — это множество подмножеств.

Соответственно, на языке теории категорий декартиан — это просто произведение объектов в категории множеств, а булениан — это, скорее всего, экспоненциал в категории множеств. Наверное для разных видов ступеней можно попробовать нарисовать коммутативные диаграммы, попробовать соотнести универсальные свойства произведений и экспоненциалов с каким-то «физическим» смыслом, который стоит за разными видами ступеней. Чтобы ответить что-то более конкретное, нужно лучше понять какой «физический» смысл стоит за разнообразиями, комплексами разнообразий, отношениями, комплексами отношений. Я не смог найти примеры.
Sign up to leave a comment.