Streaming rekursiver Abstieg eines Verzeichnisses in Haskell

Ich versuche, einen rekursiven Abstieg einer Verzeichnisstruktur mit Haskell durchzuführen. Ich möchte nur die untergeordneten Verzeichnisse und Dateien nach Bedarf abrufen (träge).

Ich habe den folgenden Code geschrieben, aber wenn ich ihn ausführe, zeigt die Ablaufverfolgung, dass alle Verzeichnisse vor der ersten Datei besucht werden:

module Main where

import Control.Monad ( forM, forM_, liftM )
import Debug.Trace ( trace )
import System.Directory ( doesDirectoryExist, getDirectoryContents )
import System.Environment ( getArgs )
import System.FilePath ( (</>) )

-- From Real World Haskell, p. 214
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents topPath = do
  names <- getDirectoryContents topPath
  let
    properNames =
      filter (`notElem` [".", ".."]) $
      trace ("Processing " ++ topPath) names
  paths <- forM properNames $ \name -> do
    let path = topPath </> name
    isDirectory <- doesDirectoryExist path
    if isDirectory
      then getRecursiveContents path
      else return [path]
  return (concat paths)

main :: IO ()
main = do
  [path] <- getArgs
  files <- getRecursiveContents path
  forM_ files $ \file -> putStrLn $ "Found file " ++ file

Wie kann ich die Dateiverarbeitung mit dem Abstieg verschachteln? Ist das Problem, dass diefiles <- getRecursiveContents path Aktion wird vor dem folgenden ausgeführtforM_ immain?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage