抽象度を上げていく。
Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
ファイルを読んで、コンテンツを大文字に変えてファイルに書き込む処理を考える。これはハンドルを開いて読み書きすればいい。
import System.IO
import Data.Char(toUpper)
main :: IO ()
main = do
inh <- openFile "input.txt" ReadMode
outh <- openFile "output.txt" WriteMode
mainloop inh outh
hClose inh
hClose outh
mainloop :: Handle -> Handle ->IO ()
mainloop inh outh =
do ineof <- hIsEOF inh
if ineof then return ()
else do inpStr <- hGetLine inh
hPutStrLn outh $ processData inpStr
mainloop inh outh
processData :: String -> String
processData = map toUpper
このmainloop関数はEOFが見つかるまでストリームを読んでいくが、これはhGetContentsで抽象化出来る
import System.IO
import Data.Char(toUpper)
main :: IO()
main = do
inh <- openFile "input.txt" ReadMode
outh <- openFile "output.txt" WriteMode
inpStr <- hGetContents inh
let result = processData inpStr
hPutStr outh result
hClose inh
hClose outh
processData :: String -> String
processData = map toUpper
さらに、さらにハンドルを開いて文字列を読み出す処理と、文字列に大して何らかの処理をしながら、ハンドルを開いてファイルに書き出すという処理もそれぞれreadFile,writeFileで抽象化できるので、結局次のようになる
import Data.Char(toUpper)
main = do
inpStr <- readFile "input.txt"
writeFile "output.txt" $ processData inpStr
processData :: String -> String
processData = map toUpper
となると、読み出すファイル名と、書き出すファイル名と、ストリームに対し作用させる関数を受け取ってよろしくやってくれる関数まであっていいと思うのだけど、それは標準ライブラリに存在するのだろうか?
convert readfile writefile (map toUpper)
みたいなの。