第8章
不純なものと純粋なものを分離する
ここにきてHello, World
Hello, World
main = putStrLn "hello, world"
I/O アクションどうしをまとめる
いくつかの便利な I/O 関数
- putStr
- putChar
- sequence
- mapM
- forever
- forM
第9章 もっと入力、もっと出力
9.1 ファイルとストリーム
入力のリダイレクト 多くの対話型プログラム
入力ストリームから文字列を得る
- getLineのかわりにgetContentsを使う
- 遅延 I/O → 遅延評価
- 必要なときに必要な読み込みしかしないから、foreverが要らない
大文字変換
10文字以下の行のみ表示
入力を変換する
10文字以下の行のやつの別形態
回文
9.2 ファイルの読み書き
ファイルを読み込んで書き出すだけの簡単なやつ
- 初登場opneFile
- 返ってくるものはただのファイルハンドル
- FilePath は単なる String の型シノニム
- hGetContentsも遅延評価なのでデカイファイルが来てもメモリを食いつぶさない
openFile :: FilePath -> IOMode -> IO Handle type FilePath = String data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode
withFile 関数を使う
withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a
なんかいろいろやってくれる感じ。
ファイルのパスと IOMode 、それに「ハンドルを受け取って I/Oアクションを返す関数」を受け取り、「そのファイルを開いてから何かして閉じる」という I/O アクションを返します。さらに withFile は、ファイルの操作中に何かおかしなことが起こった場合にもファイルのハンドルを確実に閉じてくれます。ややこしく見えるかもしれませんが、実際はとてもシンプルな関数です。特にラムダ式と一緒に使うと便利。
ブラケットの時間
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
ハンドルを握れ!
- readFile
- writeFile
- appendFile
readFileだとすっきりするよね
なお、contentsに格納されるのは文字列なので、ファイルを開いたら開きっぱなしになる可能性があるのかな?いい感じでファイルを閉じてくれそうだけど、サーバプログラムとかでは使いづらいかも。 gist.github.com
writeFileを使う
9.3 ToDoリスト
appendFileを使ってみよう。一連のdoのなかだとぶつかると思う。
アイテムの削除
(急にながくなってくる)
(例外対応)
9.4 コマンドライン引数
コマンドラインを取り扱う。 gist.github.com
- 作者: ポストメディア編集部
- 出版社/メーカー: 一迅社
- 発売日: 2008/10/10
- メディア: 大型本
- 購入: 13人 クリック: 117回
- この商品を含むブログ (10件) を見る
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (68件) を見る