Различия между функторами и эндофунторами

Может кто-нибудь объяснить в простых терминах разницу между ними? Я не совсем понимаю ту часть, где монады являются эндофенторами, а не просто функторами.

Ответ 1

Функтор может перейти от одной категории к другой, endofunctor - это функтор, для которого начальная и целевая категории одинаковы.

То же, что и с эндоморфизмами против морфизмов.

Теперь, почему монады должны быть эндофенторами?

Существует знаменитая цитата: "Монады - это всего лишь моноиды в категории эндофенторов". К счастью, кто-то еще уже объяснил это довольно хорошо в этом ответе.

Ключевой момент, по которому монада должна быть endofunctor, заключается в том, что join, как он называется в Haskell, или µ, как его обычно называют в теории категорий, является частью определения 1 монады, Теперь

Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a

поэтому результат применения функтора m к объекту (в Hask, категория типов Haskell как объекты и функции как морфизмы, тип) должен быть объектом, к которому может снова применяться m. Это означает, что он должен принадлежать категории, являющейся областью функтора m.

Функтор может быть составлен только с самим собой, если его область и кодомен одинаковы [строго, если его кодомен является подкатегорией своей области], другими словами, если он является эндонуктором. Поскольку композиция сама по себе является частью определения монады, монады - это более ранние эндофенторы.

¹ Одно определение, альтернативно, можно определить монаду с помощью (>>=) или bind и иметь join как производное свойство.