GHC has a warning for this. Enabling -Wall
(or -fwarn-unused-do-bind
) will complain whenever a do block discards a value non-explicitly:
ghci> do putStrLn <$> getLine; return ()
Warning:
A do-notation statement discarded a result of type ‘IO ()’
Suppress this warning by saying ‘_ <- (<$>) putStrLn getLine’ or by using the flag -fno-warn-unused-do-bind
However, forM_
defeats this check by discarding all the loop's result values regardless of type. One may intend to discard only ()
, but when a bug like the above slips in, forM_
will just as happily discard IO ()
or any other type too, and the checker will be none the wiser.