09122009 Haskell
例外処理をやるためにhandleとbracketがある。
Prelude> :m +Control.OldException
Prelude Control.OldException> :t handle
handle :: (Exception -> IO a) -> IO a -> IO a
Prelude Control.OldException> :t bracket
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
handleは最初の引数に処理が失敗した時の例外ハンドラ。本ではファイルのサイズを返す関数を書くときに使っていて、openに失敗したらNothingを返すようなアクションを定義してた。
bracketは最初のアクションでリソース獲得、二番目のアクションがリソース開放、最後のアクションがリソース獲得から開放までにはしるアクション。pythonでいうところのtry-except-finallyみたいなものか。
RWHではhandleとbracketを組み合わせて
getFileSize path = handle (\_ -> return Nothing) $
bracket (openFile path ReadMode) hClose $ \h -> do
size <- hFileSize h
return (Just size)
ってなってんだけど、もしhandleなしでbracketのopenが失敗して例外が返ったらどうなんのとか?基本的にhandleとbracketは組み合わせて使うものなのか?
Real World Haskell―実戦で学ぶ関数型言語プログラミングBryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
そば屋はなぜ領収書を出したがらないのか?―領収書からみえてくる企業会計・税金のしくみ
Practical Arduino: Cool Projects for Open Source Hardware (Technology in Action)


入門Git
Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
ビューティフルアーキテクチャ (THEORY/IN/PRACTICE)
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
Linuxカーネル2.6解読室
[改訂第4版] LaTeX2ε美文書作成入門