ファイルの読み書き

単純なファイルの読み書きなら、Haskell はワンライナーでできる。書き込みは writeFile、読み出しは readFile、追加書き込みは appendFile でできる。

Hugs> writeFile "hello.txt" "hello"

Hugs> readFile "hello.txt" >>= putStr
hello
Hugs> appendFile "hello.txt" ", world"

Hugs> readFile "hello.txt" >>= putStr
hello, world

文字列ではなく、リストなどのデータを記録するときは show 関数で、データを文字列に変換しておくと良い。

Hugs> writeFile "array.txt" (show [1,2,3])

Hugs> readFile "array.txt" >>= putStr
[1,2,3]

ファイル array.txt では、リストのデータを文字列に変換して記録されているので、read 関数で戻してやらないといけない。read 関数で戻すときにはどのようなデータ型に戻すのかを指定するキャスト (::[Int] など)が必要だ。

Hugs> do cs <- readFile "array.txt"; print (sum (read cs ::[Int]))
6

話がそれるが、show 関数は様々な型のデータを文字列に変換してくれるから、次の例のようにプログラムで処理したデータを表示する時に便利だ。

Hugs> putStr ("sum " ++ show [1,2,3] ++ " = " ++ show (sum [1,2,3]))
sum [1,2,3] = 6

ファイルの読み出しをすると、IOモナドの世界にワープしてしまって出られなくなるので、その後の処理もIOモナドの世界の関数 print などに関連付けてデータ処理をしなくてはならないので気をつけないといけない。といっても、return や putStr などのIOモナドの世界の関数の引数として記述すれば良いだけなので慣れの問題だけだ。

IOモナドの世界は変数のスコープに似ている。ブロックの内側から外の変数は見えるが、ブロックの外側からブロックの内側の変数を見ることはできない。同様に、IOモナドの世界からは、純粋関数の世界の関数を利用できるが、純粋関数の世界の関数からは、IOモナドのデータを利用することはできない。恐れられているIOモナドと言ってもプログラムで使うという目的からはその程度の理解で充分だ。

ともあれ、データの保存や読み出しもHugsのコマンドラインから簡単にやれることが分かったので一安心だ。
[PR]
by tnomura9 | 2009-09-21 18:46 | Haskell | Comments(0)
<< Haskell でサインカーブ... 求人難と求職難の併存 >>