обход дерева каталогов в ширину не ленив
Я пытаюсь пройти по дереву каталогов. Наивный обход в глубину, кажется, не производит данные ленивым способом и исчерпывает память. Затем я попробовал подход в ширину, который показывает ту же проблему - он использует всю доступную память, а затем вылетает.
код у меня есть:
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
Я думаю, что весь код является линейным или хвостовым рекурсивным, и я ожидаю, что список имен файлов начинается сразу, но на самом деле это не так. Где ошибка в моем коде и моем мышлении? Где я потерял ленивые оценки?