Подтвердить что ты не робот

Являются ли функции arity-n действительно просто n-категорией из-за каррирования? Могут ли они быть превращены в 1-категорию?

Этот вопрос имеет длинную прелюдию, прежде чем я могу спросить об этом:)

Пусть говорят, что типы A и B представляют категории, то функция

f:: B → A

является морфизмом между двумя категориями. Мы можем создать новую категорию с A и B как объекты и f как стрелку, подобную этой:

enter image description here

Теперь введем новую категорию C и функцию g:

g:: C → B → A

Я хотел бы иметь возможность добавлять C и g в свою категорию выше, но я не уверен, как это сделать. Интуитивно, я хочу что-то похожее на это:

enter image description here

Но я никогда не видел ничего подобного на диаграмме категории раньше. Чтобы сделать это кошерным, я мог бы ввести фиктивную стрелку g 'и построить 2-категорию, подобную этой:

enter image description here

Но это кажется тупой картиной. (Мы могли бы, конечно, использовать картинку, которую я нарисовал выше, как сокращение для правильного.) Кроме того, теперь не совсем ясно, что такое g и g '. g уже не является функцией, которая принимает в качестве входной категории категорию C и возвращает морфизм:: B → A. Вместо этого

g ':: (C → C)

g:: (C → C) → (B → A)

Если мы передадим g тождеству, тогда все будет работать нормально. Но если мы передадим ему какую-то другую функцию, то кто знает, что может случиться?

Итак, мой вопрос: есть ли n-стрелка внутри n-категории, как мы должны думать о функциях с arity n? Или есть ли более простой способ представить эту функцию в стандартную категорию, которую я пропустил?

4b9b3361

Ответ 1

Говоря о "морфизмах между категориями", здесь звучит как возможная ошибка категории (га, га). В Haskell мы чаще всего говорим о предполагаемой категории Hask, которая представляет собой некорректно идеализированную версию категории (0) объекты которой являются типами вида *, а морфизмы функции. Неясно, какие "функции" между категориями будут здесь, если они не являются морфизмами Hask.

С другой стороны, в более общей настройке вы можете определенно определить категорию, объектами которой являются другие категории (1) с любыми морфизмами, которые вы хотите, чтобы удовлетворялись необходимые свойства. Обычным примером этого является Cat, категория небольших категорий, морфизмы которых являются функторами.

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

Один из способов сделать это, если у нас уже есть способ поговорить о парах объектов как о едином объекте (обычно называемом "продуктом" какого-то рода), заключается в определении эквивалентности между совокупностью морфизмов A⊗B → C и набор морфизмов A → C B что позволяет объекту C B встать для набора морфизмов B → C.

Если рассматриваемые "пары объектов" являются категориальным продуктом, мы имеем декартовую замкнутую категорию, которые имеют как Хаск, так и Cat. В Haskell приведенная выше эквивалентность - это функции curry и uncurry (2).

Это не единственный способ поговорить о морфизмах как о объектах, конечно. Общая концепция просто называется "закрытой категорией". Но если вы думаете с точки зрения функций более высокого порядка и функционального программирования, то декартовая закрытая категория, вероятно, вы имеете в виду.


(0) Это обычно включает в себя такие вещи, как притворство ⊥, не существует (так что все функции являются полными) и обработки функций, которые производят одинаковый вывод как идентичный (например, игнорируя различия в производительности).

(1) Но не пытайтесь говорить о категории, чьи объекты есть все категории, или Бертран Рассел даст вам бизнес.

(2) Именован, конечно, логик Haskell Curry.

Ответ 2

Я довольно нелюбимый в теории категорий, но:

В программировании Haskell мы часто (притворяемся, что мы) работаем с категорией Hask, объектами которой являются типы и морфизмы Haskell, являются функциями Haskell.

Применяя это понимание к вашему примеру, я вижу, что B и A являются объектами, а f является морфизмом между ними.

g, однако, не морфизм между C и f, поэтому не следует пытаться рисовать g как стрелку между C и f стрелка.

Если применить правую ассоциативность конструктора типа ->, мы получим g :: C -> (B -> A). B -> A сам является типом Haskell и поэтому должен быть объектом Hask самостоятельно. f, однако, не, этот объект; это одно конкретное значение в типе B -> A, но объектом B -> A будет сам тип.

Это также имеет смысл думать исключительно в терминах Хаскелла. Просто потому, что g применяется к значению типа C, дает нам некоторую функцию типа B -> A, что не означает, что g возвращаемое значение имеет какое-либо отношение к f, что является некоторой другой функцией типа B -> A.

Таким образом, мы получаем f как морфизм между объектом B и объектом A и g как морфизм, нарисованный между объектом C и объектом B -> A.

Здесь, где мое знание теории теории ломается. Кажется очевидным, что между f и объектом B -> A должна быть какая-то связь, так как в Haskell f есть значение в типе B -> A. Я не знаю, что это за отношения в категориях теории.

С. Ответ А. Макканна звучит так, как будто вам нужно справиться с такими "дополнительными" отношениями, которые не моделируются непосредственно категорией. Что касается категории, объект B -> A также можно назвать D; он не имеет никакого отношения ни к чему другому, кроме как в силу морфизмов, соединяющих его с другими объектами. Это только в сочетании с другой информацией из категории "снаружи", которую мы можем идентифицировать, между A, B, f и D (действительно B -> A). Но я могу не понимать это описание.