обход дерева каталогов в ширину не ленив

Я пытаюсь пройти по дереву каталогов. Наивный обход в глубину, кажется, не производит данные ленивым способом и исчерпывает память. Затем я попробовал подход в ширину, который показывает ту же проблему - он использует всю доступную память, а затем вылетает.

код у меня есть:

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

Я думаю, что весь код является линейным или хвостовым рекурсивным, и я ожидаю, что список имен файлов начинается сразу, но на самом деле это не так. Где ошибка в моем коде и моем мышлении? Где я потерял ленивые оценки?

Ответы на вопрос(2)

Ваш ответ на вопрос