их список и список файлов, набросал такую штуку:
recursivelyParseDirectory
:: FilePath -> ([FilePath], [FilePath]) -> IO ([FilePath], [FilePath])
recursivelyParseDirectory path (directories, files) = do
dirContents <- listDirectory path :: IO [FilePath]
(ds, fs) <-
splitIntoSubdirectoriesAndFiles path dirContents :: IO
([FilePath], [FilePath])
if null ds
then return (directories, files ++ fs) -- The deepest directory has been reached
else
let
(subDirs, subFiles) = map
(\dir -> recursivelyParseDirectory (path ++ "/" ++ dir)
([], [])
)
ds
in return (directories ++ ds ++ subDirs, files ++ fs ++ subFiles)
Но вот ветка в else совсем неправильная. Во-первых, map вернет список, а мне надо будет его собрать в кортеж списков ([директория], [файл]). Но это ладно.
Самое главное, что внутри списка будет IO ([FilePath], [FilePath]). Как бы мне его объединить с ([FilePath], [FilePath]), определенными выше, чтобы все заработало?
Для варианта с одной директорией вместо списка набросал такой вариант else do (subDirs, subFiles) <- recursivelyParseDirectory (head ds) ([], []) return (directories ++ ds ++ subDirs, files ++ fs ++ subFiles) По типам все вроде совпадает, но не уверен, что там все файлы рекурсивно собрались
Обсуждают сегодня