
Hello all, I never did much IO in haskell, but now I have to process some files. I catch myself adding a mapM here and an fmap there. While it is clear to me what these functions do, I wonder if there is a way to avoid the noise. Also I could not find a simple way to pair the lines of a file with its filename. I ended up writing a function "nameAndContent". Finally I am amazed by the many "concat"s I need. Maybe these things just lie in the nature of the problem ("process a number of files"). Otherwise any style suggestions would be much appreciated. import System.FilePath.Glob import Data.List filePattern="*.hs" fileDirectory = "." processFile :: (FilePath, [String]) -> [String] processFile (path, flines) = ["done"] main = do matchingFiles <- fmap (concat . fst) $ globDir [compile filePattern] fileDirectory flines <- mapM nameAndContent matchingFiles result <- mapM (return . processFile) flines mapM putStrLn $ concat result where nameAndContent :: FilePath -> IO (FilePath, [String]) nameAndContent fn = do content <- fmap lines $ readFile fn return (fn, content)