J'ai essayé de résoudre Duplicate each element in a Haskell List tâche et faire comme un programme complet, qui écrivent la liste à la sortie standardComment contrôler la paresse exemple de double chaque élément de la liste
Voici ma solution
main :: IO() main = getList >>= return . doubleEachItem >>= putStrLn . show getList = return [1,3,5] doubleEachItem :: [Int] -> [Int] doubleEachItem = foldr (++) [] . map (take 2 . repeat)
Mais lorsque je tente de traiter très longue liste
getList = return . take 10000000000 $ repeat 15
le programme terminé avec erreur de dépassement de mémoire.
La question est: comment je peux améliorer le programme, afin qu'il puisse traiter des listes de n'importe quelle taille?
Edit:
Je pense que le programme est écrasé parce que je le lance avec la commande runghc
. Dans ce cas, ghc consomme environ 3Gbytes de mémoire et a été tué par le système d'exploitation. Le fichier de sortie après le crash était seulement d'environ 0,6 Go. La raison d'un tel comportement n'est pas claire pour moi.
Lorsque je compile le programme exécutable natif ghc haskell03.hs -o haskell03
et l'exécuter avec redirection vers un fichier ./haskell03 >out03.txt
il fonctionne parfaitement dans l'espace mémoire constant et produit le fichier de sortie avec la vitesse sur les 20MBytes/s. Lorsque le programme est terminé, le fichier de sortie prend 57 Go. Le temps d'exécution total était de 47 minutes.
Je ne vois aucun problème lors de l'exécution du même code sur ma machine. – ephemient
Note de style: 'foo >> = return. bar' est la même chose que 'fmap bar foo'. – luqui