¿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.Diferencias entre funtores y endofunctors
Respuesta
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.
- 1. ¿Hay diferencias entre "y"
- 2. Diferencias entre OTL y SOCI
- 3. Diferencias entre JPA y JPA2
- 4. diferencias entre scipy.sparse.linalg.lsmr y scipy.sparse.linalg.lsqr
- 5. Diferencias entre App.Config y Web.Config?
- 6. Diferencias entre `input` y` raw_input`
- 7. Diferencias entre Sproutcore y Ember
- 8. Diferencias entre Excepción y Error
- 9. Diferencias entre Proc y Lambda
- 10. Diferencias entre NoClassDefFoundError y ClassNotFoundException?
- 11. ¿Diferencias entre Smalltalk y python?
- 12. Diferencias entre Ant y Maven
- 13. diferencias entre memchr() y strchr()
- 14. Diferencias entre DB2 y Oracle
- 15. Diferencias entre utf8 y latin1
- 16. Diferencias entre textMultiLine y textLongMessage
- 17. Diferencias entre Narwhal y Node.js?
- 18. Diferencias entre SwingWorker y Executor
- 19. Diferencias entre Camel y BPEL
- 20. Diferencias entre AForge y OpenCV
- 21. Diferencias entre Perl y PHP
- 22. Diferencias entre .ContextMenu y .ContextMenuStrip
- 23. Diferencias entre Java y C# y .NET
- 24. Oracle Diferencias entre NVL y Coalesce
- 25. Diferencias entre ExpandoObject, DynamicObject y dynamic
- 26. Diferencias entre Javascript regexp literal y constructor
- 27. C: Diferencias entre strchr() y el índice()
- 28. diferencias entre Msxml2.ServerXMLHTTP y WinHttp.WinHttpRequest?
- 29. Diferencias entre ItemizedOverlay y Overlay class
- 30. Diferencias entre LAM MPI y OpenMPI
¿Hay algún funcionador en Haskell que no sea un endofunctor? (¿No todos asignan Hask a Hask?) – huon
Correcto, todos los funtores de Haskell son endo. –
No endofunctors están disponibles en paquetes como http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categorical-Functor.html – sdcvvc