Drkcore

09 12 2009 Haskell Tweet

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は組み合わせて使うものなのか?

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021