
Salut à tous et un grand merci pour vos réponses instructives. Ce que je retiens en résumé: la derniere expression d'un générateur peut etre un booléen qui sert de filtre, ainsi: main = putStrLn $ show $ take 10 $ filter (==2) [1..10] peut s'écrire main = putStrLn $ show $ take 10 $ [ x | x <- [1..10], x == 2 ] de plus, les evaluations se comprennent les unes dans les autres de gauche a droite. on en arrive a une expression concise et claire: main = putStrLn $ show $ take 1 $ [ (x,y,z) | x <- (reverse [1..999]) -- utilisation de de x pour générer -- le prochain tableau , y <- (reverse [1..x]) -- utilisation de x et x pour calculer le produit z , let z = show $ x * y -- utilisation de z dans le test de filtre , z == (reverse z) ] par contre: une question relative a la lazyness me chagrine: en lisant le résultat [(999,91,"90909")], on constate que seule la premiere valeur de x est nécessaire. hors si j'écris reverse [1..999] (ou last dans la solution de Dan Popa), j'imagine qu'haskell a besoin du tableau complet pour l'inverser (dans le cas de reverse) ou en trouver le dernier élément (dans le cas de last). Mes questions: - mon intuition est-elle juste ? - suis-je en train de chercher la petitte bête ? - si non: comment résoudre le pb ? cordialement Marc