計算機科学のブログ

HaskellのI/O ファイル操作 ファイルを開いて閉じる ファイルハンドル、hGetLine関数、hIsEOF関数、hPutStrLn関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT4(HaskellのI/O)、LESSON 24(ファイル操作)、24.1(ファイルを開いて閉じる)、クイックチェック 24-2の解答を求めてみる。

コード

lesson/app/Main.hs

module Main where

import Lib
import System.IO
  ( IOMode (ReadMode, WriteMode),
    hClose,
    hGetLine,
    hIsEOF,
    hPutStrLn,
    openFile,
  )

main :: IO ()
main = do
  helloFile <- openFile "hello.txt" ReadMode
  hasLine <- hIsEOF helloFile
  firstLine <-
    if not hasLine
      then hGetLine helloFile
      else return "empty"
  putStrLn firstLine
  hasSecondLine <- hIsEOF helloFile
  secondLine <-
    if not hasSecondLine
      then hGetLine helloFile
      else return ""
  goodByeFile <- openFile "goodbye.txt" WriteMode
  hPutStrLn goodByeFile secondLine
  hClose helloFile
  hClose goodByeFile
  putStrLn "done!"

入出力結果(Terminal, Zsh)

% cat hello.txt 
Hello world!
Good bye world!
% stack exec lesson-exe
Hello world!
done!
% cat goodbye.txt 
Good bye world!
% rm hello.txt 
remove hello.txt? y
% echo 'Hello world!' > hello.txt 
% cat hello.txt 
Hello world!
% stack exec lesson-exe           
Hello world!
done!
% cat goodbye.txt 

% rm hello.txt                   
remove hello.txt? y
% touch hello.txt
% stack exec lesson-exe
empty
done!
% cat goodbye.txt 

%