
When you pass an argument to
readDir = findRegularFiles >>= readFiles
it expands to
readDir arg = (findRegularFiles >>= readFiles) arg
which fails because that expression takes no argument, only
findRegularFiles does. Honestly I can't think of any way to get that
argument in there without explicitly naming it.
And no, you cannot go like this either:
readDir = readFiles =<< findRegularFiles
It still has the same problem.
On Sat, Feb 4, 2012 at 5:49 AM, Ovidiu Deac
I have the following code which works fine:
type File = (String, String) --name and content
readDir :: String -> IO [File] readDir dir = findRegularFiles dir >>= readFiles where findRegularFiles = find always (fileType ==? RegularFile) readFiles paths = mapM readFile paths >>= return.zip paths
...and I would like to write the function readDir like this: readDir :: String -> IO [File] readDir = findRegularFiles >>= readFiles where ...
...but I get the error: grep.hs:46:32: Couldn't match expected type `IO [FilePath]' with actual type `[FilePath]' Expected type: IO [FilePath] -> String -> IO [File] Actual type: [FilePath] -> IO [File] In the second argument of `(>>=)', namely `readFiles' In the expression: findRegularFiles >>= readFiles
Can somebody please explain it?
It's not a big deal. I can keep the old version which works fine. My only problem is that I thought I understood the monads better but apparently I don't :)
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners