@Ambraven @wryk Je pensais le faire, j'attendais de voir si c'était utile, comment tu voulais t'en servir, bref, ce qu'on faisait de ma toute petit ébauche de quelque chose.
En tout cas c'est bien tu vas comprendre direct les monades : dans mon message précédent, tu dois te dire «c'est dommage, ça marcherait presque d'appliquer putStrLn à generate, si ce satané generate n'était pas pourri par le IO autour». C'est justement le sens de l'opérateur «bind» : l'application dans une monade :
>>= :: IO a -> (a -> IO b) -> IO b
d'où generate >>= putStrLn :: IO ()