largura de primeira travessia da árvore de diretórios não é preguiçosa
Eu tento percorrer a árvore de diretórios. Uma travessia ingênua da primeira profundidade parece não produzir os dados de maneira preguiçosa e fica sem memória. Em seguida, tentei uma abordagem abrangente, que mostra o mesmo problema - ele usa toda a memória disponível e, em seguida, falha.
o código que tenho é:
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
Eu acho que todo o código é linear ou cauda recursiva, e eu esperaria que a listagem de nomes de arquivos começa imediatamente, mas na verdade isso não acontece. Onde está o erro no meu código e meu pensamento? Onde perdi a avaliação preguiçosa?