TIM Labs

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

| コメント(0) | トラックバック(0)
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 として扱うことができるようになった。

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



トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/343

コメントする

このブログ記事について

このページは、fujiが2012年12月12日 10:00に書いたブログ記事です。

ひとつ前のブログ記事は「スケーラブルグラフィックスSVGとは」です。

次のブログ記事は「ユニコード表をテキストファイルとして保存」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。