Endofunctor - это пара отображений: одно, которое отображает тип на другой тип, и другое, которое отображает функцию на другую функцию.В этом смысле endofunctor «имеет» fmap
, так как fmap
является отображением функции на функцию.
Монада - это триплет, состоящий из endofunctor и двух естественных преобразований.Одним из естественных преобразований является return :: a -> m a
.Другой в Хаскеле - (>>=) :: m a -> (a -> m b) -> m b
.join ms = ms >>= id
, но мы могли бы также легко сказать, что join :: m (m a) -> m a
- это естественное преобразование, связанное с монадой, и что m >>= f = join (fmap f m)
.В этом случае монада (не endofunctor) "имеет" join
в качестве функции.