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
%