Haskellのファイル入出力は簡単


2012年 12月 12日

Haskellで、SVGファイルを生成しているということは、テキストファイルを書き出しているはずだ。

ということで、このTutorilalを見ていたら、hasktut_head.png

writeFile “tut0.svg” $ writePolygons (blue [[(100,100),( … 続く

という箇所があった。$ より右側は、文字列を組み立てているだけだと思われた。

Prelude> :t writeFile
writeFile :: FilePath -> String -> IO ()

ということは、ファイルパスと文字列を渡すだけで、ファイルに書いてくれるのだ。簡単!
Haskells.jpgのサムネール画像
元々は『関数プログラミング入門』を入手して始めたHaskell手習いであるが、やはり入出力がないと面白くないとおもったのだが、この本ではなかなかそういうことが出てこないのだ。
本の終わりに近い「第10章 モナド」でやっと出てくるようなのだ。
途中は無視して、ファイルの入出力だけつまみ食いをしよう。

では、テスト!

Prelude> writeFile "test.txt" "Hello, Haskell!"

とやるとすぐ戻ってきたが、ちゃんとファイルはできただろうか。

直接テキストファイル “test.txt” を見たら、中身が “Hello, Haskell!” になっていて成功だ。

テキストファイルの書き出しができたら、次は読み込みだ。
readFile という関数が用意されていたので、変数に読み込んでみよう。

Prelude> :t readFile
readFile :: FilePath -> IO String

Prelude> readFile "test.txt"
"Hello, Haskell!"
Prelude> let str = readFile "test.txt"
Prelude> str
"Hello, Haskell!"

となって、str にファイルの内容が読み込まれたようなのだ。
でも、

Prelude> length str

<interactive>:45:8:
    Couldn't match expected type `[a0]' with actual type `IO String'
    In the first argument of `length', namely `str'
    In the expression: length str
    In an equation for `it': it = length str

となってしまい、str はふつうの文字列ではないと叱られるのだ。

str の型を調べてみると

Prelude> :t str
str :: IO String

となっていて、 String ではなくて、 IO String なのだ。

では、どうすれば、ふつうの文字列へ読み込めるだろうか。

readFile を = で受けていたのを、<- に変えてみた。

Prelude> str <- readFile "test.txt"
Prelude> str
"Hello, Haskell!"
Prelude> length str
15
Prelude> :t str
str :: String

これで、ファイルの内容を、ふつうの文字列、String として扱うことができるようになった。

ということで、極めて簡単であるが、ファイル入出力の基本が分かったことにしよう。
では、次回は、なにかもう少し役に立ちそうなファイル出力をやってみよう。