Какова теоретико-категориальная основа требования о том, что функция идентификатора Haskell должна возвращать то же значение, что и переданное?

Как все это может быть правдой?

  1. В категории Hask объекты относятся к типам Haskell, а морфизмы - к функциям Haskell. Ценности не играют роли в Hask.
  2. Морфизм идентичности определяется как стрелка, исходящая из Объекта A и оканчивающаяся на том же Объекте A.
  3. Роль тождественного морфизма играет функция Haskell id.
  4. Значение, возвращаемое функцией Haskell id, должно быть идентично значению переданного аргумента.

Если морфизм идентичности определяется в теории категорий как стрелка от объекта A обратно к тому же объекту A, разве это описание не удовлетворяется какой-либо функцией Haskell типа f :: A -> A?

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

Мне кажется, это очень простой вопрос для начинающих. Так может ли кто-нибудь дать ответ, используя только язык, символы и условные конструкции, понятные новичку?


person nclark    schedule 29.06.2015    source источник
comment
Думаю, я понимаю, о чем вы спрашиваете. Причина, по которой мы знаем, что id должна быть функцией идентичности, следует из полиморфного типа, а ‹размахивание рукой› связано с параметричность и бесплатные теоремы‹ / размахивая рукой ›которые я не совсем понимаю.   -  person jberryman    schedule 29.06.2015
comment
Да, похоже, вы прочитали сообщение, которое я указал выше. У меня есть более конкретный вопрос, чем заданный там, поэтому я надеюсь, что ответы здесь могут быть более конкретными.   -  person nclark    schedule 30.06.2015
comment
Параметричность здесь не актуальна. Существует множество категорий, которые имеют несколько параметрических функций forall a. a -> a (естественные эндоморфизмы функтора идентичности), но идентичность объекта A всегда определяется идентичностями id_A . f = f, g . id_A = g. Примером первого может быть версия Hask, которая включает bottom и notId :: a -> a; notId _ = undefined.   -  person Reid Barton    schedule 30.06.2015


Ответы (3)


id должен быть морфизмом идентичности для любого данного типа Haskell. Морфизм идентификации для типа A в Hask - это функция типа A -> A, но это не просто любая функция типа A -> A; он должен подчиняться законам категорий.

В частности, это должно быть левое и правое тождество для композиции с морфизмами к / от объекта A. Если idA является идентифицирующим морфизмом для объекта A, это означает, что для любого объекта B и морфизма f :: A -> B, f . idA должен быть точно таким же, как f, и для любого объекта C и морфизма g :: C -> A ifA . g должен быть точно таким же, как g.

Мы можем проверить ваше утверждение о том, что любая функция типа A -> A может быть идентификатором A, выбрав конкретный случай. Давайте возьмем (+1) :: Integer -> Integer в качестве идентификатора для Integer и рассмотрим функцию (*2) :: Integer -> Integer. Очевидно, что (*2) . (+1), (+1) . (*2) и просто (*2) - это одно и то же, поэтому мы показали - подождите, это совсем не одна и та же функция.

Заметьте, я не привел здесь равенство значений Haskell. Я говорю о равенстве морфизмов в категории Hask; а равенство морфизмов наверняка находится в области теории категорий, поскольку без нее законы категорий о морфизме тождества бессмысленны.

Ключевым моментом, который меня смутил в какой-то момент, является то, что, хотя нет смысла рассматривать два разных объекта с одним и тем же типом (поскольку объекты являются типами, когда мы говорим о Hask), вы можете иметь два разных морфизма с одним и тем же типом. Теория категорий действительно допускает наличие нескольких различных морфизмов между двумя объектами A и B (и допускает наличие морфизмов от объекта к самому себе, которые не морфизмами идентичности, и отличаются друг от друга). Морфизмы не определяются чисто их «конечными точками».

Законы об идентичности на самом деле представляют собой довольно строгие требования и должны сильно намекать на то, что не всякая старая A -> A функция подойдет для idA. Существует четкая интуиция, что для возможности компоновки с произвольными другими морфизмами, не изменяя их, морфизм идентичности должен «ничего не делать» (что бы это ни значило для рассматриваемой категории).

В Hask, где мы знаем, что морфизмы - это функции, есть довольно очевидная интерпретация «ничего не делать»; функция, которая просто возвращает свой ввод. Должно быть ясно, что это действительно работает для законов категорий:

f . id = f
id . f = f

А также, если предлагаемый морфизм идентичности, который делает что-то иное, кроме как возвращает свои входные данные без изменений (существуют некоторые x такие, что badId x не x), то вы можете опровергнуть законы категорий, пытаясь составить с id !

(badId . id) x
badId (id x)
badId x

badId x не x, по предположению, поэтому badId . id не может быть равно id (который определяется id x = x). Так что badId - это не левая идентичность композиции.

person Ben    schedule 30.06.2015
comment
Мне кажется, я понимаю, как на самом деле Haskell ведет себя в отношении законов категорий. Но я приписываю теории категорий несовместимое понятие равенства, основанное на идентичности объекта, то есть просто A == A, но A! = B, и, следовательно, любые два морфизма, которые начинаются и заканчиваются на одном и том же объекте, в основном являются равный. Вместо этого я должен предположить, что теория категорий НИЧЕГО не утверждает о равенстве (равенстве объектов? Равенстве морфизмов?), Что оно определяется исключительно в контексте данной категории? Я еще нигде не видел, чтобы это было записано, но я определенно могу осмыслить это ... - person nclark; 30.06.2015
comment
@nclark В основном для объектов, A == A и A! = B, и также для морфизмов f == f и f! = g. Но нет ничего, что говорило бы, что если два морфизма имеют один и тот же домен и кодомен, то они должны быть одним и тем же морфизмом; это дополнительное предположение, которому вы не обязаны следовать. - person Ben; 30.06.2015
comment
@nclark На самом деле теория категорий действительно говорит больше о равенстве морфизмов, но только то, что содержится в законах категорий: id . f = f, f . id = f и f . (g . h) = (f . g) . h. Но ваша идея о том, что два морфизма взаимозаменяемы, если они находятся между одними и теми же объектами, не следует (и в целом неверна, хотя это может быть для некоторых конкретных категорий). - person Ben; 30.06.2015
comment
Все ваши ответы отличные, большое вам спасибо! Мое отсутствие SO mojo мешает мне давать осмысленные голоса за. Хотя все они довольно полезны и актуальны, @Ben дал ответ, который наиболее близко подошел к сути моего неправильного представления о морфизме идентичности / равенства. А теперь вернемся к работе: мне нужно восстановить мое понимание теории категорий! (Не должно быть слишком сложно, я еще многому не научился.) - person nclark; 30.06.2015

Я не уверен, что правильно понял суть вашего вопроса.

Но идентичность в категориях должна удовлетворять

id . f = f
g . id = g

для любых f,g правильных типов. Итак, id - это не просто случайная функция A -> A, это функция, удовлетворяющая вышеуказанным требованиям.

Обратите внимание, что в Hask это для любого значения a :: A

id . (const a) = const a

следовательно

id (const a ()) = const a ()

следовательно

id a = a

Итак, id - это действительно то, что мы ожидаем.

person chi    schedule 29.06.2015
comment
Видите ли, я не куплюсь на это (несомненно, из-за чего-то не вижу?). Если объекты Hask действительно являются типами, тогда вы должны установить равенство, сравнивая Haskell типы, а не значения ... не так ли? Таким образом, чтобы удовлетворить требованиям идентичности, функция Haskell должна сохранять только типы, но не значения. При этом правило левого идентификатора должно быть typeof (id. F) = typeof (f), а правое identity - аналогично: typeof (g. Id) = typeof (g). (Прошу извинить за нехаскелловский псевдокод.) Так откуда же взялось это основанное на значениях понятие равенства? Вроде бы ни теория категорий, ни Хаск ... - person nclark; 30.06.2015
comment
@nclark В основном ваш аргумент утверждает, что для двух объектов A, B в категории может быть не более одного морфизма A - ›B. В целом это неверно: равенство морфизмов является гораздо более сильным требованием, чем наличие одного и того же источника / целевой объект. Возьмите векторные пространства и линейные функции как категорию: конечно, вы можете найти более одной линейной функции между реальной плоскостью и самой собой. Следовательно, существует множество морфизмов. - person chi; 30.06.2015
comment
@nclark Еще более абстрактно, создайте свою собственную категорию с двумя объектами, буквами A и B. Пусть буквы a, b, c, d будут четырьмя морфизмами, a, b действуют как тождества для A, B, в то время как оба c, d являются A - ›B. Состав определяется законами тождества. Обратите внимание, что A, B не являются наборами, поэтому у нас нет значений, о которых можно было бы говорить в этой категории. Тем не менее, у нас есть два различных морфизма A-> B, а именно c и d. - person chi; 30.06.2015
comment
@nclark Если объекты Hask являются типами, тогда вы должны установить равенство, сравнивая типы Haskell, а не значения ... не так ли? Нет, не знаешь. Стрелы - это особые вещи, отличные от предметов, и могут иметь свои собственные равенства и неравенства. Один из способов представить определение равенства стрелок - это сказать, что они принимают одинаковые аргументы для получения одинаковых результатов (хотя, вероятно, придется быть осторожным с некоторыми техническими деталями). Можно альтернативно определить равенство стрелок, сделав все одинаково типизированные стрелки равными, но результирующая категория будет слишком скучной. - person Daniel Wagner; 30.06.2015

Кажется, у вас есть несколько распространенных заблуждений о категории Hask и категориях в целом, но, возможно, все они сводятся к сути

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

В этом нет никакого смысла. Морфизмы в Hask - это функции, а функции - это значения, так что в этом смысле значения уже играют роль в Hask.

Два морфизма f и g от A до B в Hask равны тогда и только тогда, когда функции f, g :: A -> B равны, что, в свою очередь, выполняется тогда и только тогда, когда для каждого значения a :: A значения f a и g a равны. Итак, расширив это определение, мы видим, что значения, которые не обязательно являются функциями (например, a :: A), также играют определенную роль в Hask.

Унитальная и ассоциативная аксиомы для Hask в этом смысле являются равенствами функций, поэтому им есть что сказать об уровне ценности!

Априори значения нефункционального типа не появляются явно в перечне (объекты, морфизмы, идентичности, правила композиции, унитальные и ассоциативные свойства), которые составляют категорию Hask. Но на самом деле значение a :: A может быть закодировано в Hask как морфизм const a :: () -> A, а разные значения a :: A соответствуют разным морфизмам от () до A. Это факт, используемый в вычислениях chi, показывающий, что у нас нет другого выбора для функции идентичности на объект A в Hask помимо знакомого id :: A -> A; id a = a.

person Reid Barton    schedule 29.06.2015
comment
Итак, равенство морфизмов - это концепция, от которой теория категорий зависит для определения идентичности, но оставляет ее разработчику данной категории (например, Hask) определять = каким-либо образом, который работает для достижения данной цели? Учитывая это, мне теперь кажется, что в теории категорий равенство морфизмов - это подразумеваемая, расплывчатая вещь, для которой я ожидал увидеть какой-то формализм - что-то вроде класса типов, который использует теория категорий, но не предоставляет никаких примеров . Экземпляр Hask гарантирует, что id возвращает принимаемое значение. Я здесь на правильном пути? - person nclark; 30.06.2015
comment
@nclark Если бы теория категорий подробно определила равенство мофизма, вы не смогли бы моделировать столько вещей, сколько категории. Вся суть теории категорий состоит в том, чтобы сказать, что категория - это любая совокупность объектов и морфизмов, из которых могут быть составлены морфизмы, для каждого объекта существует тождественный морфизм и выполняются законы категорий. Любые другие свойства равенства намеренно оставлены неопределенными, поэтому теории теории категорий не могут полагаться на другие свойства, но верны независимо от того, чем они являются; точно так же, как идея композиции остается неопределенной. - person Ben; 30.06.2015
comment
@nclark, я боюсь, что скоро мы можем говорить на разных языках, но с точки зрения теории категорий важно только то, что совокупность морфизмов от одного конкретного объекта к другому образует набор. Тогда неявно мы можем говорить о том, что означает равенство одного морфизма другому как элементов множества. В случае с Hask способ, которым мы бы построили этот набор, состоит в том, чтобы сначала записать все строки, которые представляют функции от A до B, затем сформировать набор частных, где мы идентифицируем две строки, если они представляют равные функции (в смысле, описанном в моем ответе ). - person Reid Barton; 30.06.2015