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
?