
Thanks a lot Daniel, but I am a bit lost (up to not long ago I did not even know the existence of a control monad...and some unstructured reading did not help). Some online research about mapM and fmap led me here http://en.wikibooks.org/wiki/Haskell/Category_theory and I think I am a bit astray at this point ;-) Why does my "simple" snippet below raise a number of errors? Cheers Lorenzo import Data.Ord import Data.List main :: IO () main = do let nums=[1,2] let fl = getAllLengths nums putStrLn "fl is, " print fl filename :: Int -> FilePath filename i = "file" ++ show i ++ ".dat" fileLength :: FilePath -> IO Int fileLength file = fmap length (readFile file) getAllLengths :: [Int] -> IO [Int] getAllLengths nums = mapM (fileLength . filename) nums On 10/11/2010 05:21 PM, Daniel Fischer wrote:
On Monday 11 October 2010 16:56:58, Lorenzo Isella wrote:
Dear All, Another I/O question. Let us say that you are given a list of files file1.dat, file2.dat...file10.dat and so on (i.e. every file is indexed by a number and every file is a single column where every entry is a string without spaces). In the snippet below I read file1.dat, convert it to a list and then print out its length. Now, how can I iterate the process on file1.dat, file2.dat and file3.dat and store the lengths in a list?
fileLength :: FilePath -> IO Int fileLength file = fmap length (readFile file)
filename :: Int -> FilePath filename i = "file" ++ show i ++ ".dat"
getAllLengths :: [Int] -> IO [Int] getAllLengths nums = mapM (fileLength . filename) nums
If you want something other than the character count, instead of fileLength use e.g.
countLines :: FilePath -> IO Int countLines file = fmap (length . lines) (readFile file)
or whatever you're interested in.
Another nice thing is often forM (from Control.Monad)
forM nums $ \i -> do let filename = "file" ++ show i ++ ".dat" contents<- readFile filename let result = function contents doSomethingOrNot return result
I would like to map the file reading and following operations on the list [1,2.3], but that is giving me a headache. It is relatively easy to create the file name
filename="file"++(show i)++".dat" , for i=1,2,3
but it the the iteration part that is giving me troubles. Any suggestion is appreciated. Cheers
Lorenzo