
Alexander Dunlap wrote:
It seems like foldM ought to do what you want. Could you post some more details please?
This is a function that I have working in Ocaml which is a little more lenient about IO :-). This is what I have but won't compile: fileNames :: ([FilePath] -> FilePath -> FilePath -> [FilePath]) -> [FilePath] -> FilePath -> IO [FilePath] fileNames builder builder_accum topdir = do names <- getDirectoryContents topdir let properNames = filter (`notElem` [".", ".."]) names (dirs, files) <- splitDirFile properNames let accum <- foldl' (\ acc f -> builder acc topdir f) builder_accum files return $ foldM (\ acc d -> fileNames builder accum (topdir > d)) accum dirs I get following error on the foldM: Couldn't match expected type `[FilePath]' against inferred type `IO [FilePath]' Expected type: IO [FilePath] Inferred type: IO (IO [FilePath]) Thinking about it some more, I can see the problem; accum is an "IO [FilePath]" and my builder function requires a "[FilePath]". Once I get the function working I would like to generalize it to: fileNames :: (a -> FilePath -> FilePath -> a) -> a -> FilePath -> IO a Cheers, Erik -- ----------------------------------------------------------------- Erik de Castro Lopo ----------------------------------------------------------------- "Re graphics: A picture is worth 10K words - but only those to describe the picture. Hardly any sets of 10K words can be adequately described with pictures." -- Alan Perlis