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

Другой способ сделать это - поставить

cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); 

после того, как ваш cin>>number; полностью очистит входной буфер (отклонение всех дополнительных символов до тех пор, пока не будет найдена новая строка). Вы должны #include <limits> получить метод max().

30
задан Andrey Tyukin 9 July 2018 в 23:50
поделиться

3 ответа

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

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

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

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

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

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

34
ответ дан 27 November 2019 в 23:51
поделиться

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

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

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

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

14
ответ дан 27 November 2019 в 23:51
поделиться

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

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

7
ответ дан 27 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: