haskell - Diferencias entre funtores y endofunctors
functional-programming (1)
¿Alguien puede explicar en términos simples la diferencia entre los dos? No entiendo del todo la parte en la que las mónadas son endofuncionantes y no solo funcionadoras.
Un functor puede ir de una categoría a una diferente, un endofunctor es un functor para el cual la categoría de inicio y la meta son las mismas.
Lo mismo que con endomorfismos versus morfismos.
Ahora, ¿por qué las mónadas deben ser endofunctors?
Existe la famosa cita de que "Las mónadas son solo monoides en la categoría de endofunctors". Afortunadamente, alguien más ya lo ha explicado bastante bien en esta respuesta .
El punto clave por el que una mónada tiene que ser un endofunctor, es que join
, como se llama en Haskell, o µ
, como suele llamarse en la teoría de categorías, es parte de la definición¹ de una mónada. Ahora
Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a
por lo que el resultado de aplicar el funtor m
a un objeto (en Hask, la categoría de tipos Haskell como objetos y funciones como morfismos, un tipo) debe ser un objeto que m
pueda aplicarse de nuevo. Eso significa que debe pertenecer a la categoría que es el dominio del functor m
.
Un functor solo puede estar compuesto consigo mismo si su dominio y codominio son los mismos [estrictamente, si su codominio es una subcategoría de su dominio], en otras palabras, si es un endofunctor. Como la capacidad de compilación consigo misma forma parte de la definición de una mónada, las mónadas son a fortiori endofunctors.
¹ Una definición, uno puede definir alternativamente una mónada usando (>>=)
o bind
y tener join
como una propiedad derivada.