2012年 12月 12日
Haskellで、SVGファイルを生成しているということは、テキストファイルを書き出しているはずだ。
ということで、このTutorilalを見ていたら、
writeFile “tut0.svg” $ writePolygons (blue [[(100,100),( … 続く
という箇所があった。$ より右側は、文字列を組み立てているだけだと思われた。
Prelude> :t writeFile
writeFile :: FilePath -> String -> IO ()
ということは、ファイルパスと文字列を渡すだけで、ファイルに書いてくれるのだ。簡単!
元々は『関数プログラミング入門』を入手して始めた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 として扱うことができるようになった。
ということで、極めて簡単であるが、ファイル入出力の基本が分かったことにしよう。
では、次回は、なにかもう少し役に立ちそうなファイル出力をやってみよう。