Si está usando la palabra de la forma en que creo que está, el encadenamiento no es más que un objeto que devuelve algún objeto al que se le puede aplicar otro método que le permite hacer una cadena de métodos. Esto tiene poco que ver con las mónadas. En el mundo de la programación funcional, lo más parecido a esto es componer un montón de funciones: f (g (h (i (j (kx)))))
.
Pero puedes acercarte a las mónadas desde la perspectiva de generalizar la composición. Suponga que tiene una función f
llevar objetos de tipo a objetos de tipo b
, escritos como f:a -> b
. Ahora suponga que tiene otra función g:b -> c
. Puedes componerlos para obtener g . f : a -> c
g . f : a -> c
. Puede componerlos porque f
asigna a un tipo que g
acepta como argumento. Puede encadenar cualquier secuencia de funciones como esta si el encabezado de cada función coincide con la cola de la siguiente.
Ahora suponga que tiene una función en el nivel de tipo que asigna tipos a tipos. Puede sonar un poco desconocido pero es compatible con muchos idiomas. Por ejemplo, en C ++ puedes usar plantillas. Entonces, dado el tipo int
, podemos convertirlo en el tipo de listas de int
s así: list
. Por lo tanto, puede pensar en la list
como una función de nivel de tipo que asigna objetos a listas de objetos. Java tiene genéricos y estoy seguro de que otros lenguajes tienen cosas similares.
- ¿Cuál es la diferencia entre teoría de la computación y algoritmo?
- ¿Por qué el costo amortizado de las operaciones n add (k) es log (k)?
- Si un problema np-hard se resuelve en tiempo polinómico, ¿es eso una prueba de que p = np o este problema se ha clasificado incorrectamente?
- Cómo probar la independencia entre variables continuas
- Cómo resolver rápidamente cualquier problema
Ahora suponga que tiene una función de tipo f:a - > mb
y una función de tipo g:b -> mc
, donde m
es una de las funciones de nivel de tipo que mencioné. Por ejemplo, en C ++ podríamos elegir m
como list
para que f
asigne objetos de tipo a listas de objetos de tipo b
. Ya no podemos componer estas funciones de la manera obvia porque la cabeza de f
no es el mismo tipo de cola de g
.
Pero el hecho de que la regla de composición habitual no funcione no significa que no podamos inventar nuestra propia función de composición. Supongamos que m
es la list
. ¿Cómo podríamos componer f
y g
? Bueno, g
necesita argumentos de tipo b
, y aunque f
no produce argumentos de tipo b
, produce una lista de ellos. Por lo tanto, no podemos aplicar g
al tipo de retorno de f
, pero podemos aplicarlo a cada uno de los elementos del tipo de retorno. Eso nos da una lista de listas. Y dada una lista de listas, podemos aplanarla a una simple lista concatenando todas las listas juntas. En otras palabras, he descrito una forma de tomar f:a - >mb
g:b -> mc
para hacer una nueva función de tipo f:a - >mc
. Entonces, si usamos la nueva regla de composición, podemos encadenar tantas funciones de esta ‘forma’ como queramos. Esta regla de composición se puede implementar como una función que llamaré ‘función de encadenamiento’ solo por esta respuesta.
Una mónada es una función de nivel de tipo como m
junto con una función de encadenamiento y un conjunto de reglas que esta función de encadenamiento debe cumplir. Hay muchas cosas diferentes con las que podríamos reemplazar m
además de list
pero, sorprendentemente, muchas de las útiles cumplen el mismo conjunto de reglas.