迷いませんか?

プログラミング、電子工作、ゲーム・・・etc、色々やるけど中途半端なブログです。

bracket,bracketOnError

bracketとbracketOnErrorの処理がよくわからなかったのでまとめる

bracketは
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
( (a -> IO b)に当てはまる関数をf,(a -> IO c)に当てはまる関数をdとする)
という型になっていて、
まずdを処理します。
そしてその後fを処理するというようになっていて、
最終的にIO cを返すということで正しいはず。
このとき、エラーが起こるとfを実行し確実にリソースの解放を行う。
リソースというのはハンドルなどのこと

なので順番的にはd, f と実行してIO cを返すが
エラー時にはfを実行してリソースを解放する。

bracketOnErrorは、型はbracketと同じで
bracketOnError :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
となっているが、bracketとは処理の方法が違う(方法というか順番?)
bracketでは確実にdの後にfを処理していたが
bracketOnErrorではdのあとは何も処理せずIO cを返す。

このため、bracketでは解放する処理をfにだけ書いておけばよかったが
bracketOnErrorでは、それだと解放されなくなるので
dの方にも解放処理を書かねばならなくなり面倒くさくなる。
しかし、これにより普段は実行したくないけどエラー時はエラーを知らせるなどの
処理ができるようになるところにメリットがあるんじゃないかなと思う

どうせこの考えは間違ってそうなのでだれか指摘ちょーだいლ(╹◡╹ლ)