
thanks for the explanations! I guess it's clear now
On Sat, Feb 4, 2012 at 3:02 PM, Chaddaï Fouché
On Sat, Feb 4, 2012 at 12:05 PM, David McBride
wrote: 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.
I would say the problem is even before that, the expression "findRegularFiles >>= readFiles" is not well typed :
(>>=) :: Monad m => m a -> (a -> m b) -> m b specialized here in : (>>=) :: IO a -> (a -> IO b) -> IO b
but :
findRegularFiles :: FilePath -> IO [FilePath]
so findRegularFiles is not of type "IO a", so can't be the first argument of (>>=) (or the second of (=<<) since that's just the flipped version).
But there is a solution ! What you're searching here is a function of type : ? :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
A kind of monadic composition, there is an operator for that in Control.Monad since ghc 6.12 or even before :
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
so :
readDir = findRegularFiles >=> readFiles
or
readDir = readFiles <=< findRegularFiles
will work :)
-- Jedaï