Drkcore

06 12 2009 Haskell Tweet

Haskellのファイル入出力(RWH 7章)

抽象度を上げていく。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
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)

みたいなの。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021