opciones - listas en haskell
¿Hay algún andador de directorio en Haskell? (4)
Aquí hay una forma de enumerar todos los archivos de Haskell en un árbol de directorios, usando el árbol de directorios que no está en un directorio oculto (cuyo nombre comienza por ''.''):
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
Funciona tanto en Windows como en Linux.
¿Hay algún andador de directorio recursivo en Haskell para poder escribir algo así como
listing <- walkDir "/tmp"
No me gustaría escribir el mío Puedo instalar alguna dependencia de cabal, pero quiero que sea multiplataforma (al menos Linux y Windows).
http://hackage.haskell.org/package/FilePather tiene ese tipo de funcionalidad de directorio recursivo para caminar.
Tengo una definición recursiva para recorrer un directorio usando el paquete de ruta de archivo:
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)
El paquete filemanip
proporciona funciones potentes y elegantes para eso. Por ejemplo, proporciona una función de fold
que llamará recursivamente a su función en un árbol de directorios. Como ejemplo, lo usé aquí para enumerar recursivamente los archivos en un directorio comenzando desde el más antiguo