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
id
должна быть функцией идентичности, следует из полиморфного типа, а ‹размахивание рукой› связано с параметричность и бесплатные теоремы‹ / размахивая рукой ›которые я не совсем понимаю. - person jberryman   schedule 29.06.2015forall 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