{-# OPTIONS_GHC -Wall #-} import System.Directory import System.FilePath import System.Environment import Data.List hiding (find) -- <<main main :: IO () main = do [s,d] <- getArgs r <- find s d print r -- >> -- <<find find :: String -> FilePath -> IO (Maybe FilePath) find s d = do fs <- getDirectoryContents d -- <1> let fs' = sort $ filter (`notElem` [".",".."]) fs -- <2> if any (== s) fs' -- <3> then return (Just (d </> s)) else loop fs' -- <4> where loop [] = return Nothing -- <5> loop (f:fs) = do let d' = d </> f -- <6> isdir <- doesDirectoryExist d' -- <7> if isdir then do r <- find s d' -- <8> case r of Just _ -> return r -- <9> Nothing -> loop fs -- <10> else loop fs -- <11> -- >>