Haskell - Monades

Monadsne sont rien d'autre qu'un type de fonction applicative avec quelques fonctionnalités supplémentaires. C'est une classe Type qui régit trois règles de base appeléesmonadic rules.

Les trois règles sont strictement applicables sur une déclaration Monad qui est la suivante -

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

Les trois lois de base applicables à une déclaration de la Monade sont:

  • Left Identity Law - Le returnne modifie pas la valeur et ne doit rien changer à la Monad. Il peut être exprimé par "return> => mf = mf".

  • Right Identity Law - Le returnne modifie pas la valeur et ne doit rien changer à la Monad. Il peut être exprimé par "mf> => return = mf".

  • Associativity- Selon cette loi, les Functors et l'instance Monad devraient fonctionner de la même manière. Elle peut être mathématiquement exprimée par "(f> ==> g)> => h = f> => (g> = h)".

Les deux premières lois itèrent le même point, c'est-à-dire une return devrait avoir un comportement identitaire des deux côtés de la bind opérateur.

Nous avons déjà utilisé beaucoup de Monades dans nos exemples précédents sans nous rendre compte qu'il s'agit de Monades. Prenons l'exemple suivant où nous utilisons une monade de liste pour générer une liste spécifique.

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

Ce code produira la sortie suivante -

[2,6,10,14,18]