Newbie question:&nbsp; Given a list of type &#39;[FilePath]&#39;, how do I create a list of all those directories which do not actually exist, and then print the list?&nbsp; I&#39;ve figured out how to extract the ones which *do* exist, like so:<br>
<br>module Main where<br>
<br>
import Control.Monad (filterM)<br>
import System.Directory (doesDirectoryExist)<br>
import System.Environment (getArgs)<br>
<br>
main :: IO ()<br>
main = do <br>
&nbsp;&nbsp;&nbsp; dirs &lt;- getArgs<br>
&nbsp;&nbsp;&nbsp; let existing = filterM doesDirectoryExist dirs<br>&nbsp;&nbsp;&nbsp; ......<br><br>which gives me a list of type &#39;IO [FilePath]&#39;.&nbsp; However, because of the &#39;IO&#39; tag, I cannot figure out how to do any of the following 3 things (noted in comments):<br>
<br>&nbsp;&nbsp;&nbsp; -- filter via composition<br>&nbsp;&nbsp;&nbsp; let bogusDirs = filterM (not . doesDirectoryExist) dirs<br><br>&nbsp;&nbsp;&nbsp; -- test for emptiness<br>&nbsp;&nbsp;&nbsp; if bogusDirs /= []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- print the list<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then putStrLn $ &quot;bogus: &quot; ++ show bogusDirs<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else putStrLn &quot;OK&quot;<br><br>Can anyone set me straight?&nbsp; How do I make the IO tag go away, or am I going about this all wrong?&nbsp; E.g. the &#39;filterM (not . doesDirectoryExist) dirs&#39; expression gives the following compilation error:<br>
<br>~/code/haskell$ ghc -o newbie newbie.hs<br><br>newbie.hs:16:35:<br>&nbsp;&nbsp;&nbsp; Couldn&#39;t match expected type `Bool&#39; against inferred type `IO Bool&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expected type: FilePath -&gt; Bool<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inferred type: FilePath -&gt; IO Bool<br>
&nbsp;&nbsp;&nbsp; In the second argument of `(.)&#39;, namely `doesDirectoryExist&#39;<br>&nbsp;&nbsp;&nbsp; In the first argument of `filterM&#39;, namely<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `(not . doesDirectoryExist)&#39;<br><br><br><br><br>