2008-09-08 [長年日記]
λ. “Lightweight Monadic Regions” by Oleg Kiselyov and Chung-chieh Shan
Lightweight Monadic Regions | Lambda the Ultimate より。
リージョンを使ったリソース管理を行うモナドをHaskellで実装する話。 ランク2多相を用いてリソースがエスケープしないことを保障するのは誰でも思いつくけど、リージョンの入れ子とリージョン多相性を工夫して実現していて凄かった。 インターフェースだけ見ると非常に単純なんだけど、実装を見るとお馴染みの TypeCast を使ってて「やっぱしw」という感じ。 あと、typestate*1を型にエンコードすることでリソースが(手動で)解放されることを保証する方法も実装*2して、比較をしている。
どうでもいいけど、型エラーのメッセージが分かりにくいかもという話に対して、「Such error messages are also emitted when ..., so they should be familiar to haskell programmers.」とか書いてあって、うけた。
*1 リソースの(外部から見える)状態を、手続きの事前条件・事後条件として宣言できるようにして、状態遷移を記述できるようにする手法。<URL:http://netail.net/?date=20040805#p04> <URL:http://www.cse.wustl.edu/~mdeters/seminar/spring2002/torri-typestate.pdf>
*2 こっちの方はだいぶ変態的