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?