Die erste Durchquerung des Verzeichnisbaums ist nicht faul
Ich versuche den Verzeichnisbaum zu durchlaufen. Eine naive Tiefenüberschreitung scheint die Daten nicht träge zu produzieren und hat keinen Speicher mehr. Ich habe als nächstes einen umfassenden Ansatz ausprobiert, der das gleiche Problem zeigt: Er nutzt den gesamten verfügbaren Speicher und stürzt dann ab.
Der Code, den ich habe, ist:
getFilePathBreadtFirst :: FilePath -> IO [FilePath]
getFilePathBreadtFirst fp = do
fileinfo <- getInfo fp
res :: [FilePath] <- if isReadableDirectory fileinfo
then do
children <- getChildren fp
lower <- mapM getFilePathBreadtFirst children
return (children ++ concat lower)
else return [fp] -- should only return the files?
return res
getChildren :: FilePath -> IO [FilePath]
getChildren path = do
names <- getUsefulContents path
let namesfull = map (path </>) names
return namesfull
testBF fn = do -- crashes for /home/frank, does not go to swap
fps <- getFilePathBreadtFirst fn
putStrLn $ unlines fps
Ich denke, dass der gesamte Code entweder linear oder rekursiv ist, und ich würde erwarten, dass die Auflistung der Dateinamen sofort beginnt, aber in Wirklichkeit nicht. Wo ist der Fehler in meinem Code und meinem Denken? Wo habe ich faul Auswertung verloren?