cat
Haskellで簡単なプログラムを書こうとしています。複数のファイル名を引数として取り、各ファイルを順番にSTDOUTに書き込みたいのですが、私のプログラムは1つのファイルしか出力せずに終了します。
渡された最初のファイルだけでなく、すべてのファイルをコードで印刷するにはどうすればよいですか?
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
私は次のようなコードを実行しています:
runghc cat.hs file1 file2