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

Являются ли все функторы Haskell функционалами?

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

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

E : A -> A.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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