Get list of the executables in the current directory
I wouldn't import System.Directory qualified, it doesn't export anything that could clash with standard names.

import Control.Applicative
import Control.Monad
import System.Directory

main :: IO ()
main = do
    files &lt;- getDirectoryContents =&lt;&lt; getCurrentDirectory
    exes &lt;- filterM (liftA executable &lt;$&gt; getPermissions) files
    print exes


You can toss out the Functor and Applicative stuff and just compose Monads.

import Control.Monad
import System.Directory

main :: IO ()
main = do
    files &lt;- getDirectoryContents =&lt;&lt; getCurrentDirectory
    exes &lt;- filterM (liftM executable . getPermissions) files
    print exes


You could also get rid of reverse bind and use the forward version, it's maybe more familiar?

import Control.Monad
import System.Directory

main :: IO ()
main = do
    files &lt;- getCurrentDirectory &gt;&gt;= getDirectoryContents
    exes &lt;- filterM (liftM executable . getPermissions) files
    print exes


I'd eliminate the explicit use of bind entirely though, then it becomes easier to turn this into a function that can work on directories other than the current one.

import Control.Monad
import System.Directory

main :: IO ()
main = do
    dir &lt;- getCurrentDirectory
    printExecutables dir

printExecutables :: FilePath -&gt; IO ()
printExecutables dir = do
    files &lt;- getDirectoryContents dir
    exes &lt;- filterM (liftM executable . getPermissions) files
    print exes