Может кто-нибудь объяснить в простых терминах разницу между ними? Я не совсем понимаю ту часть, где монады являются эндофенторами, а не просто функторами.
Ответ 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
как производное свойство.