Haskell - Mónadas

Monadsno son más que un tipo de Functor Aplicativo con algunas características adicionales. Es una clase de tipo que gobierna tres reglas básicas conocidas comomonadic rules.

Las tres reglas son estrictamente aplicables a una declaración de Mónada que es la siguiente:

class Monad m where  
   return :: a -> m a 
   (>>=) :: m a -> (a -> m b) -> m b 
   (>>) :: m a -> m b -> m b 
   x >> y = x >>= \_ -> y 
   fail :: String -> m a  
   fail msg = error msg

Las tres leyes básicas que se aplican a una declaración de Mónada son:

  • Left Identity Law - el returnLa función no cambia el valor y no debería cambiar nada en la Mónada. Puede expresarse como "return> => mf = mf".

  • Right Identity Law - el returnLa función no cambia el valor y no debería cambiar nada en la Mónada. Puede expresarse como "mf> => return = mf".

  • Associativity- De acuerdo con esta ley, tanto la instancia de Functors como la de Monad deben funcionar de la misma manera. Se puede expresar matemáticamente como "(f> ==> g)> => h = f> => (g> = h)".

Las dos primeras leyes iteran el mismo punto, es decir, una return debe tener un comportamiento de identidad en ambos lados de la bind operador.

Ya hemos utilizado muchas Mónadas en nuestros ejemplos anteriores sin darnos cuenta de que son Mónadas. Considere el siguiente ejemplo donde estamos usando una List Monad para generar una lista específica.

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

Este código producirá el siguiente resultado:

[2,6,10,14,18]