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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage