[Haskell-beginners] What is the best practice for code]

Chaddaï Fouché chaddai.fouche at gmail.com
Tue Nov 10 04:16:48 EST 2009


On Mon, Nov 9, 2009 at 10:46 PM, legajid <legajid at free.fr> wrote:
> {-    Third solution  -}
> f3 = filter (\(x,y,z) -> (x+y+z)==19) ((\ xx -> [(x, y, z) | x <- xx, y <-
> xx, z <- xx, y < x, z < y]) nombres )

If you want to use list comprehension just use it for all filtering necessary :
(Si tu veux utiliser les list comprehension utilises les donc pour
tout filtrage nécessaire :)

> f3 = [(x, y, z) | x <- nombres, y <- nombres, z <- nombres, y < x, z < y, x+y+z == 19]

Alternatively, you may try to express the same thing without the list
comprehension :
(Tu peux aussi essayer d'exprimer la même chose avec des fonctions seulement :)

> f4 = filter (\[x,y,z] -> z < y && y < x && x+y+z == 19) . replicateM 3 $ nombres

It is almost always better (performance-wise) to only generate the
correct solutions rather than generate all then filter (though if you
can improve the modularity and/or clarity of your code by separating
the two steps it's worth considering), so in your case :
(Il est presque toujours préférable (du point de vue des performances)
de générer uniquement les solutions correctes plutôt que de générer
toutes les possibilités puis de les filtrer (encore que si ça te
permet d'améliorer la modularité ou la clarté de ton code ça vaut le
coup de se poser la question), donc dans ton cas ça donnerait :)

> f5 = reverse [(x, y, z) | x <- [3..9], y <- [2 .. x-1], let z = 19 - x - y, y > z, z > 0]

-- 
Jedaï


More information about the Beginners mailing list