Как "моноид на аппликативных функторах" отличается от "моноида в категории эндофенторов"?

Возможно, ни одно из этих утверждений не является категорически точным, но монада часто определяется как "моноид в категории эндофенторов"; Alternative Хаскелла определяется как "моноид на аппликативных функторах", где аппликативный функтор является "сильным слабым моноидальным функтором". Теперь эти два определения звучат довольно похоже на невежественные (меня), но работают по-разному. Нейтральный элемент для альтернативы имеет тип fa и, таким образом, "пуст", а для монады имеет тип a → ma и, следовательно, имеет смысл "непустой"; операция для альтернативы имеет тип fa → fa → fa, а операция для монады имеет тип (a → fb) → (b → fc) → (a → fc). Мне кажется, что настоящая важная деталь относится к категории эндофенторов по сравнению с эндофунторами, хотя, возможно, важна "сильная слабость" в альтернативе; но что там, где я запутался, потому что, по крайней мере, в Haskell, монады становятся альтернативами: и я вижу, что я еще не получил точного категорического понимания всех деталей здесь.

Как можно точно выразить, какова разница между альтернативой и монадой, так что они оба являются моноидами, относящимися к эндофенторам, и тем не менее у одного есть "пустая" нейтраль, а у другого есть "непустой" нейтральный элемент?

Ответ 1

В целом, моноид определяется в моноидальной категории, которая является категорией, которая определяет какое-то (тензорное) произведение объектов и единичного объекта.

Наиболее важно то, что категория типов является моноидальной: произведение типов a и b является просто типом пар (a, b), а типом единицы является ().

Моноид затем определяется как объект m с двумя морфизмами:

eta :: () -> m
mu  :: (m, m) -> m

Обратите внимание, что eta просто выбирает элемент m, так что эквивалентно mempty и кэрри mu становится mappend обычного Haskell Monoid класса.

Так что это категория типов и функций, но есть и отдельная категория эндофункторов и естественных преобразований. Это тоже моноидальная категория. Тензорное произведение двух функторов определяется как их состав Compose fg, а unit - единичный функтор Id. Моноид в этой категории - монада. Как и прежде, мы выбираем объект m, но теперь это endofunctor; и два морфизма, которые сейчас являются естественными преобразованиями:

eta :: Id ~> m
mu  :: Compose m m ~> m

В компонентах эти два естественных преобразования становятся:

return :: a -> m a
join :: m (m a) -> m a

Аппликативный функтор также может быть определен как моноид в категории функторов, но с более сложным тензорным произведением, называемым сверткой Дня. Или, что то же самое, его можно определить как функтор, который (слабо) сохраняет моноидальную структуру.

Alternative является семейство моноидов в категории типов (не эндофункторов). Это семейство генерируется аппликативным функтором f. Для каждого типа a у нас есть моноид, mempty которого является элементом fa а mappend отображает пары fa в элементы fa. Эти полиморфные функции называются empty и <|>.

В частности, empty должен быть полиморфным значением, означающим одно значение на каждый тип a. Это, например, возможно для функтора списка, где пустой список полиморфен в a, или для Maybe с полиморфным значением Nothing. Обратите внимание, что это все полиморфные типы данных, которые имеют конструктор, который не зависит от параметра типа. Интуиция заключается в том, что, если вы думаете о функторе как о контейнере, этот конструктор создает и пустой контейнер. Пустой контейнер автоматически полиморфен.

Ответ 2

Обе концепции привязаны к идее "моноидальной категории", которая является категорией, которую вы можете определить как понятие моноида в (и некоторых других типах алгебраических структур). Вы можете думать о моноидальных категориях как: категория определяет абстрактное понятие функций одного аргумента; моноидальная категория определяет абстрактное понятие функций нулевых аргументов или множественных аргументов.

Монада является моноидом в категории эндофунторов; другими словами, это моноид, где произведение (функция из двух аргументов) и тождество (функция от 0 аргументов) используют понятие многопараметрической функции, определенной конкретной (причудливой) моноидальной категорией (моноидальная категория эндофенторов и состав).

Прикладной функтор является моноидальным функтором. Другими словами, это функтор, который сохраняет всю структуру моноидальной категории, а не только часть, которая делает ее категорией. Очевидно, что это означает, что он имеет функции отображения N для функций с любым числом аргументов, а не только функции одного аргумента (например, нормальный функтор).

Таким образом, монада существует в пределах определенной моноидальной категории (которая является категорией эндофенторов), а аппликативный функтор отображает между двумя моноидальными категориями (которые являются одной и той же категорией, следовательно, это своего рода эндофон).