Как "моноид на аппликативных функторах" отличается от "моноида в категории эндофенторов"?
Возможно, ни одно из этих утверждений не является категорически точным, но монада часто определяется как "моноид в категории эндофенторов"; 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 для функций с любым числом аргументов, а не только функции одного аргумента (например, нормальный функтор).
Таким образом, монада существует в пределах определенной моноидальной категории (которая является категорией эндофенторов), а аппликативный функтор отображает между двумя моноидальными категориями (которые являются одной и той же категорией, следовательно, это своего рода эндофон).