首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找文件夹的所有子文件夹?

如何查找文件夹的所有子文件夹?
EN

Stack Overflow用户
提问于 2013-05-23 22:13:50
回答 2查看 305关注 0票数 7

我想枚举Haskell中某个文件夹的所有子文件夹。获取所有文件夹内容很容易,有一个getDirectoryContents函数。但是我该如何过滤它们呢?因为getDirectoryContents返回一个IO [FilePath],而filter需要[a],所以我不能直接把这两个放在一起。(显然,我是一条有单数和do-notation的新鲜鱼。)

代码语言:javascript
复制
getAllFolders :: FilePath -> IO [FilePath]
getAllFolder path = do
    allItems <- getDirectoryContents path
    -- now what? the predicate is doesDirectoryExist
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-23 22:27:00

代码语言:javascript
复制
getAllFolders path = do
    contents <- getDirectoryContents path
    -- do something with contents now, it's a plain [FilePath]

问题是谓词doesDirectoryExist的类型是FilePath -> IO Bool。对于这样的事情,有

代码语言:javascript
复制
ghci> :t Control.Monad.filterM
Control.Monad.filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]

Control.Monad中定义的filterM,因此

代码语言:javascript
复制
getAllFolders path = do
    contents <- getDirectoryContents path
    filterM doesDirectoryExist contents

或者,不将目录的内容绑定到名称,

代码语言:javascript
复制
getAllFolders path = getDirectoryContents path >>= filterM doesDirectoryExist

和无指针:

代码语言:javascript
复制
getAllFolders = getDirectoryContents >=> filterM doesDirectoryExist
票数 7
EN

Stack Overflow用户

发布于 2013-05-23 22:24:58

看起来Control.Monad提供的filterM就是答案:

代码语言:javascript
复制
getAllFolders :: FilePath -> IO [FilePath]
getAllFolders path = do
    allItems <- getDirectoryContents path
    justFolders <- filterM doesDirectoryExist allItems
    return justFolders
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16716267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档