szerokość pierwszego przejścia drzewa katalogów nie jest leniwa
Próbuję przejść przez drzewo katalogów. Naiwne przejście po pierwszej głębi wydaje się nie produkować danych w leniwy sposób i zabraknie pamięci. Następnie wypróbowałem pierwsze podejście, które pokazuje ten sam problem - wykorzystuje całą dostępną pamięć, a następnie ulega awarii.
kod jaki mam to:
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
Myślę, że cały kod jest rekurencyjny liniowo lub ogonowo i spodziewałbym się, że lista nazw plików zacznie się natychmiast, ale w rzeczywistości tak nie jest. Gdzie jest błąd w moim kodzie i moje myślenie? Gdzie straciłem leniwą ocenę?