Las mónadas son útiles en cualquier idioma. Haskell los utiliza mucho para eliminar repeticiones. Vea cómo Haskell usó Monads para eliminar el código repetitivo para manejar fallas en un cálculo, por ejemplo.
En Haskell tenemos un tipo Quizás que modela cálculos que pueden fallar. En Java solo usa un puntero nulo que puede pertenecer a cualquier tipo. Esto significa que el verificador de tipo no tiene idea de si tiene el potencial de devolver un puntero nulo o no. Como resultado, estos punteros nulos tienden a desmarcarse y, por lo tanto, la excepción de puntero nulo es un problema extremadamente común en Java. Lo mismo ocurre en Python con nulo y Perl con undef. C generalmente solo hace algo como return -1, que en realidad es un miembro válido del tipo y, por lo tanto, puede provocar errores en la lógica que nunca causan un bloqueo. Idiomas como Haskell y ML adoptan un enfoque más basado en principios y reflejan esta falla potencial en el tipo.
Verifique el tipo de la función de búsqueda.
lookup :: Eq a => a -> [(a,b)] -> Maybe b
- Planeo ir al extranjero para realizar más estudios en el sector aeroespacial. ¿Qué tan buena es la ingeniería aeronáutica en la Universidad Manipal (o debería considerar mecánica en la Universidad VIT)?
- El cerebro de mi hermano pequeño está más del 95% muerto debido a un trágico incidente. Actualmente está en un ventilador. Los doctores se han rendido. ¿Hay alguna posibilidad de que su cerebro pueda mejorar? ¿Cómo?
- Quiero almacenar datos de existencias en una base de datos. Podría ser fecha | stock | precio | volumen. Pensé que era una gran tabla para crear y mis datos encajarían perfectamente en una tabla tridimensional con el siguiente eje (fecha, nombre de stock, datos), pero esta no es una base de datos normalizada. ¿Cuál es el mejor formato para mi base de datos?
- Quiero que alguien chatee para mejorar mi idioma. Alguien puede ayudar?
- ¿Es segura mi cuenta bancaria?
Esto significa que toma una clave, una lista asociativa, y tal vez devuelve el valor asociado con esa clave. Sin embargo, podría no devolver nada si no hay ningún valor asociado con esa clave.
¿Qué sucede si quisiera agregar los valores asociados con tres de las claves?
addThreeValues1 :: (Eq a, Num b) => a -> a -> a -> [(a, b)] -> Quizás b
addThreeValues1 k1 k2 k3 assoc =
búsqueda de caso k1 asociación de
Nada -> nada
Solo v1 -> búsqueda de caso k2 asociación de
Nada -> nada
Solo v2 -> caso de búsqueda k3 asociación de
Nada -> nada
Just v3 -> Just (v1 + v2 + v3)
Observe cómo estamos repitiendo este patrón del bloque de casos una y otra vez y tenemos que verificar explícitamente Nada y devolver Nada cada vez que vemos obtener Nada. Esto es realmente molesto. Entonces, podría preguntarse, ¿se ve obligado a verificar explícitamente los errores cada vez que llama a una función que puede fallar una mala idea? Ciertamente parece innecesariamente complicar el código. Bueno, no si tienes la Mónada tal vez.
addThreeValues2 :: (Eq a, Num b) => a -> a -> a -> [(a, b)] -> Quizás b
addThreeValues2 k1 k2 k3 assoc = do
v1 <- búsqueda k1 assoc
v2 <- búsqueda k2 assoc
v3 <- búsqueda k3 assoc
Solo (v1 + v2 + v3)
Aquí tenemos lo mejor de ambos mundos. Excepciones comprobadas explícitamente sin todo el código repetitivo.
Hay muchos más ejemplos de esto. Intente escribir código puro que calcule valores aleatorios pasando el generador de números aleatorios explícitamente y luego revise la mónada Rand. Es exactamente el mismo tipo de beneficio.