syd_sydの日記

2006-06-13

[][][] bracketの例 : HAppSより

404 Not Found

を偶々読んでいて知りました。これは実装に標準のNetwork.Socketを使っているぽい。

http://happs.org/HAppS/src/HAppS/Protocols/SMTP.hs からの例:

hostSend :: HostName -> Int -> Envelope String -> IO ()
hostSend host portNum msg = bracket (connectTo host (PortNumber $ fromIntegral portNum))
                                    (\h -> hClose h `E.catch` (\_ -> return ()))
                                    (flip handleSend msg)

handleSend :: Handle -> Envelope String -> IO ()

connectToで接続したらhandleSendを実行する。bracketにより、handleSendが失敗するしないに関わらず、hCloseによりハンドルは正しく閉じられる。hCloseの例外処理は書いておく必要がある。 Javaのfinallyブロック内で例外が投げられうるのと同じ。


[][]network-alt

network-alt

Networkとは別のライブラリらしい。後で調べる。