No, no son lo mismo en absoluto. Una clase define un solo tipo, como String, File o Robot. En un lenguaje con genéricos o plantillas, puede parametrizar una definición de clase sobre algún tipo y obtener una clase genérica como List o Set donde T es un parámetro de tipo. Esto ya no es un tipo, es un constructor de tipos: una función de Tipo a Tipo, le da un tipo como String o File y le da otro tipo como List o Set .
Tal tipo de constructor puede ser una mónada si contiene ciertos métodos que siguen ciertas reglas (leyes de mónada). Por lo tanto, no es una clase, ni un tipo, ni ninguna clase genérica, sino un cierto subconjunto de tipos genéricos (parametrizados), cierto subconjunto de constructores de tipos.
El conjunto de operaciones que un constructor de tipo debe tener para ser una mónada se puede escribir de esta manera:
- ¿Hay alguna forma de que la IA entienda el sarcasmo?
- ¿Los NPC en los videojuegos se consideran IA o están controlados por la CPU?
- ¿Cuáles son los próximos desafíos posibles para que DeepMind de Google fascine al mundo?
- ¿Es posible que un programador de aprendizaje automático no sepa lo que la máquina ha aprendido?
- ¿Qué dominio debo elegir entre Machine Learning y Seguridad de red?
interfaz Monad (m: Tipo -> Tipo) donde
mapa: (a -> b) -> ma -> mb
puro: a -> ma
unirse: m (ma) -> ma
donde (a -> b) significa un tipo de función de a a b, y “ma” significa aplicar el constructor de tipos m para escribir a, de modo que si m es Lista y a es Cadena, entonces “ma” es una lista de cadenas, como List en algunos otros idiomas.
Y por conveniencia, a menudo se definen métodos adicionales como
ap: m (a -> b) -> ma -> mb
enlace: ma -> (a -> mb) -> mb
Que también se conocen como operadores y >> =.
Todos estos tipos de funciones y también sus propiedades provienen de la teoría de categorías, la fuente de todo ese negocio de mónada, donde la mónada se define como un endofunctor con un par de transformaciones naturales con ciertas propiedades (por cierto, el ‘mapa’ de la función anterior dice que es un endofunctor y las funciones ‘puro’ y ‘unir’ son esas dos transformaciones naturales).
Como puede ver, arriba solo definimos algunos tipos para funciones genéricas y constructores de tipos, pero no un solo tipo real o implementación de esas funciones. Esto se debe a que cosas muy diferentes pueden ser mónadas, no hay una implementación única.