2012-04-26 16 views

Respuesta

50

Un functor puede ir de una categoría a otra, un endofunctor es un functor para el cual el inicio y la categoría de destino son los mismos.

Igual que con endomorfismos frente a 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 in this answer. El punto clave por el que una mónada tiene que ser un endofunctor, es join, como se llama en Haskell, o µ, como se suele llamar en teoría de categoría, 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 de Haskell como objetos y funciones como morfismos, un tipo) debe ser un objeto que m de nuevo se puede aplicar a. Eso significa que debe pertenecer a la categoría que es el dominio del functor m.

Un functor solo se puede componer 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 se trata de 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 tiene join como propiedad derivada.

+4

¿Hay algún funcionador en Haskell que no sea un endofunctor? (¿No todos asignan Hask a Hask?) – huon

+4

Correcto, todos los funtores de Haskell son endo. –

+3

No endofunctors están disponibles en paquetes como http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categorical-Functor.html – sdcvvc