[Haskell-fr] euler 4: vos commentaires ?
Marc Chantreux
khatar at phear.org
Tue Feb 9 16:02:27 EST 2010
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
More information about the Haskell-fr
mailing list