¿Son mónada (programación funcional) y clase (programación orientada a objetos) la misma cosa?

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:

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.

Una clase es una plantilla instanciable que describe la inicialización (constructor), propiedades (variables) y métodos (funciones). Actúa como una plantilla para hacer nuevos objetos que siguen una determinada estructura.

Una mónada es un patrón en el que almacena un valor envuelto en una función como una variable, y lo pasa a una o una serie de funciones que toman valores envueltos en función como argumento y devuelve valores envueltos en función.