Haskell在目录中获取目录

Haskell在目录中获取目录,haskell,Haskell,如何获取目录中的目录列表 我提出了以下建议,但我希望有一种更优雅的方式: import System.Directory import qualified Filesystem.Path as FsP import Filesystem.Path.CurrentOS import Control.Monad getDirectories :: Prelude.FilePath -> IO [Prelude.FilePath] getDirectories x = do listDir

如何获取目录中的目录列表

我提出了以下建议,但我希望有一种更优雅的方式:

import System.Directory
import qualified Filesystem.Path as FsP
import Filesystem.Path.CurrentOS
import Control.Monad

getDirectories :: Prelude.FilePath -> IO [Prelude.FilePath]
getDirectories x = do
  listDirectory x
  >>= (return . fmap decodeString)
  >>= return . fmap (FsP.append (decodeString x))
  >>= (return . fmap encodeString)
  >>= filterM doesDirectoryExist

看起来您正在使用不推荐使用的软件包,不如改用该软件包:

import           Control.Monad    (filterM)
import           System.Directory (doesDirectoryExist, listDirectory)
import           System.FilePath  ((</>))

getDirectories :: FilePath -> IO [FilePath]
getDirectories filePath = do
  allFiles <- listDirectory filePath
  filterM (doesDirectoryExist . (filePath </>)) allFiles
导入控制.Monad(filterM) 导入System.Directory(doesDirectoryExist,listDirectory) 导入System.FilePath(()) GetDirectory::FilePath->IO[FilePath] getDirectories filePath=do 所有文件IO[文件路径] GetDirectory文件路径=listDirectory文件路径 >>=filterM(doesDirectoryExist.(文件路径)) 注意:您的函数版本将返回列表中每个输出目录的输入文件路径。虽然这可能是您想要的,但我给您的
getDirectories
版本可能更通用,因为它的行为与
listDirectory
完全相同,只需修剪文件/可执行文件


EDIT:将导入从
System.FilePath.Posix
更改为
System.FilePath
,以实现真正的平台独立性。感谢您的建议。

您只需要
System.Directory

import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory, getDirectoryContents)

listDirs :: IO [FilePath]
listDirs = getCurrentDirectory >>= getDirectoryContents >>= filterM doesDirectoryExist
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory)

listDirs :: FilePath -> IO [FilePath]
listDirs path = getDirectoryContents path >>= filterM (doesDirectoryExist . (++) path)
如果要将filepath作为参数传递,请不要使用
getCurrentDirectory

import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory, getDirectoryContents)

listDirs :: IO [FilePath]
listDirs = getCurrentDirectory >>= getDirectoryContents >>= filterM doesDirectoryExist
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory)

listDirs :: FilePath -> IO [FilePath]
listDirs path = getDirectoryContents path >>= filterM (doesDirectoryExist . (++) path)

当您已经使用
>=
运算符时,是否需要
Do
符号?您是正确的,它不需要。带有
getCurrentDirectory
的示例应该可以工作,但是另一个不会
getDirectoryContents
提供相对文件路径中的内容,而不是绝对的@basil henry fixedWell您现在缺少路径分隔符“/”或“\”(在Windows上)。在我的解决方案中,我使用
文件路径
包中的
()
对路径进行依赖于平台的附加。您只需将其作为参数传递即可
foo/
而不是
foo
。bfd。如果你想变得迂腐,你应该导入
System.FilePath
,而不是
System.FilePath.Posix
,以实现真正的平台独立性。很公平!)