Haskell: can't use “map putStrLn”?
I have a list of strings, and tried this:
ls = [ "banana", "mango", "orange" ] main = do map PutStrLn list_of_strings
That didn't work, and I can't understand why.
ghc print-list.hs print-list.hs:3:0: Couldn't match expected type `IO t' against inferred type `[IO ()]' In the expression: main When checking the type of the function `main'
Any hints? I suppose it has to do with map returning a list and not a value, but I didn't find an easy way to fix this.
Right now the only way I know to print a list of strings is to write a function that will iterate the list, printing each element (print if the list is [a], but print and recurse if it's (a:b)). But it would be much simpler to just use map...
The type of the
main function should be
IO t (where
t is a type variable). The type of
map putStrLn ls is
[IO ()]. This why you are getting this error message. You can verify this yourself by running the following in
Prelude> :type map putStrLn ls map putStrLn ls :: [IO ()]
One solution to the problem is using
mapM, which is the "monadic" version of
map. Or you can use
mapM_ which is the same as
mapM but does not collect the returned values from the function. Since you don't care about the return value of
putStrLn, it's more appropriate to use
mapM_ has the following type:
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
Here is how to use it:
ls = [ "banana", "mango", "orange" ] main = mapM_ putStrLn ls