Все ли функторы Haskell являются эндофункторами?

Я немного сбит с толку, и мне нужен кто-нибудь, чтобы меня поправить. Давайте обрисуем мое текущее понимание:

Где E - эндофунктор, а A - некоторая категория:

E : A -> A.

Поскольку все типы и морфизмы в Haskell относятся к категории Hask, не является ли любой функтор в Haskell также эндофунктором? F : Hask -> Hask.

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


person Jonathan Sterling    schedule 17.07.2010    source источник
comment
Есть ли какое-то слово перед "Где _1 _..."?   -  person kennytm    schedule 18.07.2010


Ответы (3)


Вы можете уточнить, спрашиваете ли вы о «функторах в Haskell» или о Functors. Не всегда ясно, какая категория предполагается, когда в Haskell используются термины теории категорий.

Но да, предположение по умолчанию - Hask, который считается категорией типов Haskell с функциями как морфизмами. В этом случае эндофунктор F на Hask будет сопоставлять любой тип A с типом F (A) и любую функцию f между двумя типами A и B с функцией F ( f) между некоторыми типами F (A) и F (B).

Если мы ограничимся только теми эндофункторами, которые сопоставляют любой тип a с типом (f a), где f является конструктором типа с видом * -> *, то мы можем описать связанную карту для функций как функцию высшего порядка с типом (a -> b) -> (f a -> f b), который имеет Конечно, типовой класс называется Functor.

Однако легко представить себе хорошо работающие эндофункторы на Hask, которые нельзя записать (напрямую) как экземпляр Functor, например, функтор, отображающий тип a в Either a t. И хотя очевидно, что в функторе из Hask в какую-то другую категорию нет особого смысла, разумно рассмотреть (контравариантный) функтор из Hask в Hask op.

Кроме того, экземпляры Functor обязательно отображаются из всей категории Hask в какое-то ее подмножество, которое, таким образом, также образует категорию. Но также разумно говорить о функторах между подмножествами Hask. Например, рассмотрим функтор, который отправляет типы Maybe a в [a].

Вы можете ознакомиться с category-extras package, который предоставляет некоторые структуры, основанные на теории категорий, встроенные в Hask вместо того, чтобы принимать его во всей полноте.

person C. A. McCann    schedule 17.07.2010
comment
Это немного касательно, но я хотел проверить свое понимание: отображение из Maybe a в [a] можно представить несколькими способами: (a) Функтор, где Maybe и [] образуют подкатегории из Hask. (b) Естественное преобразование, где Maybe и [] образуют эндофункторы на Hask. (c) Семейство морфизмов в категории Hask, от Maybe a до [a] для всех a в Obj (Hask). Это все правильно? - person Tom Crockett; 18.07.2010
comment
Дополнение: (a) и (b), конечно, зависят от отображения, удовлетворяющего законам функторов и естественных преобразований, соответственно. Будет ли справедливо сказать, что если законы функторов выполняются для (a), то то же отображение можно рассматривать как (b), и наоборот? - person Tom Crockett; 18.07.2010
comment
@Tom: Я ... так думаю? Мне это кажется правильным. Фактически, я думаю, что любая функция с типом forall a. Maybe a -> [a] должна быть естественным преобразованием. maybeToList в данных. Может быть, это (или достаточно описывает) все, что вы упомянули, я полагаю, но мое собственное понимание теории категорий довольно ограничено, так что не принимайте это как евангелие ... - person C. A. McCann; 18.07.2010
comment
@Jonathan: это будет двойная категория Hask, которая имеет те же объекты, что и Hask, но все морфизмы обратные. См. en.wikipedia.org/wiki/Opposite_category - person Tom Crockett; 18.07.2010
comment
@ Джонатан Стерлинг: Что сказал @Tom. Простым примером в Haskell является функтор, который отображает любой тип a на тип (a -> t) для некоторого фиксированного t и любую функцию a -> b на функцию (b -> t) -> (a -> t). Это двойник стандартного Functor преобразования a в (t -> a) для фиксированного t, более известного как Reader монада. - person C. A. McCann; 18.07.2010

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

  • Hask ^ op, что Hask со всеми перевернутыми стрелками
  • Hask * Hask, функторы на нем - бифункторы
  • Категории запятых, т. Е. объекты - это морфизмы фиксированного объекта a, морфизмы - коммутативные треугольники
  • Категории функторов, морфизмы - это естественные преобразования
  • Категории алгебры
  • Моноидальные категории
  • Категории Kleisli
  • ...

возьмите копию Категории для рабочего математика Mac Lane, чтобы иметь определения, и попытайтесь самостоятельно найти проблему, которую они решают в Haskell. Особенно подавитесь сопряженными функторами (которые являются начальными / конечными объектами в правильной категории) и их отношениями с монадами.

Вы увидите, что даже если существует одна большая категория (Hask или, возможно, «поднятые объекты из Hask с помощью правильных стрелок / products / ...», которая инкапсулирует языковые варианты Haskell, такие как нестрогость и ленивость), собственно производные категории выразительны.

person Alexandre C.    schedule 19.07.2010
comment
Большое спасибо. Я могу проверить эту книгу. - person Jonathan Sterling; 19.07.2010
comment
Имейте в виду, что вы должны читать эту книгу с целью (либо функциональное программирование, либо алгебраическая геометрия, или что-то еще), потому что она довольно кратка относительно примеров, и вы каким-то образом обязаны предоставить свой . Тем не менее, это делает ее невероятно гибкой книгой, которой пользуются ученые с самыми разными кругозорами. - person Alexandre C.; 19.07.2010

Возможно релевантное (или, по крайней мере, интересное) обсуждение конкретно монад можно найти в статье «Монады не обязательно должны быть эндофункторами»:

http://www.cs.nott.ac.uk/~txa/publ/Relative_Monads.pdf

person Gian    schedule 17.07.2010
comment
Как бы то ни было, монады в стандартном смысле теории категорий действительно определяются как эндофункторы, тогда как класс типа Monad является более узким понятием, как в том же смысле, что я описываю для Functor, так и с некоторыми дополнительными сложностями, возникающими из-за очень агрессивного декартова - закрытая структура Hask. - person C. A. McCann; 18.07.2010