我试图编写一个返回给定目录的所有子目录的函数(递归)。
到目前为止我所拥有的是:
String a[] = new String[]{"Hello.jpg","Goodbye.mp4","Free.xlsx","GettingStarted","File.81723.domain.8080.pdf"};
for (String s : a) {
if (s.matches(".*\\.[^.]+"))
System.out.println(s + ": true");
else
System.out.println(s + ": false");
}
这似乎有效。但是递归有问题 - 我想摆脱import System.Directory
import Control.Monad
import Data.List
getSubDirs :: FilePath -> IO [FilePath]
getSubDirs dir =
getDirectoryContents dir
>>= filterM (\x -> return $ x /= "." && x /= "..")
>>= mapM (makeAbsolute . (\x -> dir ++ "/" ++ x))
>>= filterM doesDirectoryExist
>>= return . reverse
getDirTree :: [FilePath] -> IO [FilePath]
getDirTree [] = return []
getDirTree l@(x:xs) = do
a <- getSubDirs x >>= getDirTree
b <- getDirTree xs
return (nub $ l ++ a ++ b)
中的nub
。
答案 0 :(得分:1)
这看起来不对:
l
最后一行添加了x:xs
b
l
getDirTree xs
,b
调用中包含xs
参数,因此{{1}将包含xs
。因此,return ( x : a ++ b )
被包含两次(在每个递归步骤!)。
请尝试{{1}}。
答案 1 :(得分:1)
这似乎有效:
getDirTree' :: FilePath -> IO [FilePath]
getDirTree' path = do
subs <- getSubDirs path
as <- mapM getDirTree' subs
return $ subs ++ concat as