J'apprends actuellement Haskell (je suis programmeur de métier, mais c'est ma première tentative dans un langage fonctionnel).
Je veux écrire une fonction qui parcourt une liste et renvoie l'élément minimum et maximum de cette liste. C'est un peu ce que font les fonctions Prelude minimum
et maximum
faire, mais les deux en même temps. J'ai trouvé le code suivant :
import Data.List
-- Declaration of rand
minMax :: [Int] -> Maybe (Int, Int)
minMax [] = Nothing
minMax (x:xs) = Just (foldl' f (x, x) xs)
where
f (a, b) c = (if c < a then c else a, if c > b then c else b)
rand
est une fonction qui génère une liste infinie de nombres. Le problème est que lorsque j'ajoute ce qui suit main
fonction :
main = print $ minMax $ take 1000000 $ rand 7666532
compiler et exécuter tout cela avec profilage, il me montre que cela utilise plus de 200 Mo de mémoire, donc ce n'est certainement pas une fonction à espace constant (ce que j'aimerais qu'elle soit).
La question est de savoir pourquoi et ce que je dois changer pour y remédier. D'après ce que je comprends foldl'
plie la liste de gauche à droite (de la même façon qu'elle est générée) et n'est pas paresseux, donc je ne vois pas pourquoi l'utilisation de la mémoire est si élevée. Je suis presque sûr que c'est le minMax
qui est incorrecte, car le simple fait d'imprimer ladite liste, en utilisant la fonction
main = print $ take 1000000 $ rand 7666532
me donne 1MB d'utilisation, ce que je comprends et attends.