トップ >
技術メモ (ソフトウェア開発) >
はすけるで遊ぶ >
HaskellのファイルIO
(2009.5.12) ページを分割し、加筆。
Haskellでファイルを読み書きしたりする方法について。
readFile, writeFile
簡単にファイルを読み込むには、Prelude モジュールの readFile 関数を呼び出します。型はこう;
- readFile :: FilePath -> IO String
-
- type FilePath = String
また、ファイルに書き込むには、writeFile 関数を呼び出します。
- writeFile :: FilePath -> String -> IO ()
readFileの第一引数はファイル名で、ファイルを開くところからしてくれます。実際の読み込みは遅延評価され、必要でない部分は読み込まれません。
次の例は単にファイルの内容を表示します。
- main = do
- cs <- readFile "03readfile.hs"
- putStr cs
次の例はファイルの先頭5行のみを表示します。必要でない部分は読み込まれません。
- doHead :: Int -> String -> String
- doHead n cs =
- unlines $ take n $ lines cs
-
- main = do
- cs <- readFile "maybe.hs"
- putStr $ doHead 5 cs
例外の捕捉
ファイルが見つからないときは実行時エラー (例外) が投げられます。例外はcatch関数で捕まえます。
catch関数の型は、
- catch :: IO a -> (IOError -> IO a) -> IO a
catchの第一引数が例外が発生するかもしれない処理、第2引数がエラーハンドラ関数です。
例外が発生したときは第2引数の関数が呼び出されて、catchの戻り値はその関数の戻り値になります。
次の例は、ファイルが見つからなかったらエラーメッセージを表示します。
- import System
- import IO
-
- onError :: String -> IOError -> IO String
- onError filename error = do
- hPutStrLn stderr $ "File not found: " ++ filename
- return []
-
- main = do
- args <- getArgs
- content <- if null args
- then getContents
- else catch (readFile $ head args)
- (onError $ head args)
- putStr content
(1) catchの第2引数として渡すためにonErrorを定義します。戻り値の型は、catchの第1引数に合わせます。readFileがIO Stringなので、IO Stringです。
(2) getArgs関数はコマンドライン引数の配列を返します。
コマンドの引数が与えられていないときは標準入力から読み込み、引数があるときはそのファイルを読み込みます。
この例は作為的で、普通ならputStrも例外が発生するかもしれない処理のなかに書くところです。
ファイルハンドル
readFile, writeFile は大雑把すぎて、書き込み・読み込みモードを指定したりできません。
自分で制御したいときは System.IO モジュールの関数を用います。名前からだいたい何をするものか見当がつきます。
- openFile :: FilePath -> IOMode -> IO Handle
-
- data IOMode
- = ReadMode
- | WriteMode
- | AppendMode
- | ReadWriteMode
-
- hClose :: Handle -> IO ()
-
- hGetChar :: Handle -> IO Char
- hGetLine :: Handle -> IO String
-
- hPutChar :: Handle -> Char -> IO ()
- hPutStr :: Handle -> String -> IO ()
- hPutStrLn :: Handle -> String -> IO ()
TODO: 説明を追加。
トップ >
技術メモ (ソフトウェア開発) >
はすけるで遊ぶ > HaskellのファイルIO
Netsphere Laboratories http://www.nslabs.jp/
Copyright (c) HORIKAWA Hisashi. All rights reserved.
[PR]