2024年4月6日土曜日

Haskell入門 関数型プログラミングの基礎と実践 P.212

最近は、久しぶりにHaskellの本を読んでいる。 以前学んだことはだいぶ忘れている。
半分まで読んだあたりで、複数ファイルをConcatして表示するというコードがあったので、試したら出力はstdoutのみだった。試しに、ファイルにも出力できないかと思い、書き換えてみたが、うまくいかない。ChatGPTの助けを借りて、なんとかできた。

module Main where
import Control.Exception (bracket, finally)
import Control.Monad (forM_)
import System.IO
 ( hFlush,stdout,Handle,FilePath,IOMode(..)
   ,openFile,hClose,hIsEOF,hGetLine,hPutStrLn
 )
import System.Environment (getArgs)
import Data.Char (toUpper)
main :: IO()
main = do
     filePaths <- getArgs
     hdl2 <- openFile "output.txt" WriteMode
     concatMultiFiles filePaths hdl2
concatMultiFiles :: [FilePath] -> Handle -> IO()
concatMultiFiles filePaths dst =
  forM_ filePaths $ \filePath ->
    bracket
      (openFile filePath ReadMode)
      hClose
      (\hdl -> copyFile hdl dst)

copyFile :: Handle -> Handle -> IO()
copyFile src dst = loop
 where
  loop = do
    isEof <- hIsEOF src
    if isEof
      then return ()
      else do
        line <- hGetLine src
        hPutStrLn dst line
        hPutStrLn stdout line
        hFlush dst
        loop

ポイントは、最後から2行目のhFlush dstを追加したことだった。


0 件のコメント:

コメントを投稿