How do I implement `cat` in Haskell?
===

I am trying to write a simple `cat` program in Haskell. I would like to take multiple filenames as arguments, and write each file sequentially to **STDOUT**, but my program only prints one file and exits.

What do I need to do to make my code print every file, not just the first one passed in?

    import Control.Monad as Monad
    import System.Exit
    import System.IO as IO
    import System.Environment as Env
    
    main :: IO ()
    main = do
        -- Get the command line arguments
        args <- Env.getArgs
    
        -- If we have arguments, read them as files and output them
        if (length args > 0) then catFileArray args
    
        -- Otherwise, output stdin to stdout
        else catHandle stdin
    
    catFileArray :: [FilePath] -> IO ()
    catFileArray files = do
        putStrLn $ "==> Number of files: " ++ (show $ length files)
        -- run `catFile` for each file passed in
        Monad.forM_ files catFile
    
    catFile :: FilePath -> IO ()
    catFile f = do
        putStrLn ("==> " ++ f)
        handle <- openFile f ReadMode
        catHandle handle
    
    catHandle :: Handle -> IO ()
    catHandle h = Monad.forever $ do
        eof <- IO.hIsEOF h
        if eof then do
            hClose h
            exitWith ExitSuccess
        else
            hGetLine h >>= putStrLn


I am running the code like this:

    runghc cat.hs file1 file2