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?

questionAnswers(2)

yourAnswerToTheQuestion