Все ли функторы Хаскелла являются эндофункторами? - PullRequest
30 голосов
/ 18 июля 2010

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

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

E : A -> A.

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

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

Ответы [ 3 ]

34 голосов
/ 18 июля 2010

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

Но да, предположение по умолчанию - Hask , которое принимается за категорию типов Haskell с функциями в качестве морфизмов. В этом случае endofunctor 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 ор .

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

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

14 голосов
/ 19 июля 2010

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

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

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

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

7 голосов
/ 18 июля 2010

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

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

...