mapM_
is useful for executing something only for its side effects. For example, printing a string to standard output doesn’t return anything useful – it returns ()
. If we have a list of three strings, we would end up accumulating a list[(), (), ()]
. Building this list has a runtime cost, both in terms of speed and memory usage, so by using mapM_
we can skip this step entirely.
However, sometimes we need to execute side effects and build up a list of the results. If we have a function such as
lookupUserById :: UserId -> IO User
Then we can use this to inflate a list of UserId
s to a list of User
s:
lookupUsers :: [UserId] -> IO [User]
lookupUsers = mapM lookupUserById