[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