Le truc du contexte, je pense qu'ya une bonne image pour le représenter.Ce qui est propre au monade et que n'ont pas les applicatives, c'est que la suite d'une fonction dépende de ce qui se passe à un moment donné.Exemple:foo :: IO ()foo = dos <- getLinecase s of"hello" -> putStrLn " world!"_ -> fooici, on fait quelque chose dans IO, et selon le résultat, il peut se passer deux choses complètement différentes. On se sert beucoup de ce genre de "contexte" dans les parsers par exemple, c'est littéralement explicit, les parsers ont une forte analogie avec la monade State.
Alors qu'avec Applicative, tu peux avoir des "effets", des computations avec un petit truc en plus (parseurs qui retournent une valeur mais qui entre temps ont consumé une partie de l'input pour produire ces valeurs), etc, mais t'es obligé de garder la même "structure" pour ton code, ex:
data Person = Person { age :: Int, name :: String }blah :: Parser Personblah = Parser<$> parseInt<*> parseStringT'auras beau faire ce que tu veux, taper dans tes mains, danser la salsa, etc, tu pourras pas changer le comportement de ce parseur de "personnes" selon la valeur de l'Int ou de la chaine de caractères.
Enfin, pour terminer, c'est cet article que j'ai trouvé le plus profond sur les monades: http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html