Есть ли какой-нибудь ходок в Haskell? - программирование
Подтвердить что ты не робот

Есть ли какой-нибудь ходок в Haskell?

Есть ли какой-нибудь рекурсивный ходок в Haskell, поэтому я мог бы написать что-то вроде

listing <- walkDir "/tmp"

Я бы не хотел писать свои собственные. Я могу установить некоторую зависимость от cabal, но я хочу, чтобы она была кросс-платформой (по крайней мере, Linux и Windows).

4b9b3361

Ответ 1

Вот один из способов перечислить все файлы Haskell в дереве каталогов, используя directory-tree, который не находится в скрытом каталоге (чье имя начинается с '.'):

import Data.Traversable (traverse)
import System.Directory.Tree (
    AnchoredDirTree(..), DirTree(..),
    filterDir, readDirectoryWith
    )
import System.FilePath (takeExtension)

listFilesDirFiltered = do
    _:/tree <- readDirectoryWith return "C:\\devmy\\code"
    traverse print $ filterDir myPred tree
    return ()
  where myPred (Dir ('.':_) _) = False
        myPred (File n _) = takeExtension n == ".hs"
        myPred _ = True

main = listFilesDirFiltered

Работает как с Windows, так и с Linux.

Ответ 3

У меня есть рекурсивное определение для перемещения по каталогу с помощью пакета filepath:

import Control.Monad
import System.Directory
import System.FilePath
import System.Posix.Files

-- | Traverse from 'top' directory and return all the files by
-- filtering out the 'exclude' predicate.
traverseDir :: FilePath -> (FilePath -> Bool) -> IO [FilePath]
traverseDir top exclude = do
  ds <- getDirectoryContents top
  paths <- forM (filter (not.exclude) ds) $ \d -> do
    let path = top </> d
    s <- getFileStatus path
    if isDirectory s
      then traverseDir path exclude
      else return [path]
  return (concat paths)

Ответ 4

Пакет filemanip предоставляет мощные и элегантные функции для этого. Например, он предоставляет функцию fold, которая будет рекурсивно вызывать вашу функцию в дереве каталогов. В качестве примера я использовал здесь для рекурсивного отображения файлов в каталоге, начиная с самого старого