El primer recorrido del árbol de directorios no es perezoso.

Intento atravesar el árbol de directorios. Un cruce ingenuo de profundidad primero no parece producir los datos de forma perezosa y se queda sin memoria. A continuación, probé un enfoque amplio, que muestra el mismo problema: utiliza toda la memoria disponible y luego se bloquea.

El código que tengo es:

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

Creo que todo el código es lineal o recursivo de cola, y espero que la lista de nombres de archivos comience de inmediato, pero de hecho no lo hace. ¿Dónde está el error en mi código y mi pensamiento? ¿Dónde he perdido la evaluación perezosa?

Respuestas a la pregunta(2)

Su respuesta a la pregunta