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ę?

questionAnswers(2)

yourAnswerToTheQuestion