当たり前だけど、 unsafeInterleaveIO を使って処理を遅延すると bracket 系の関数でリソースを開放できなくなるんだなぁ。 #Haskell

処理が実行されなくてもリソース開放処理が実行されるようにしようと思うと、ファイナライザを使うことになるけれど、 http://hackage.haskell.org/package/base-4.11.1.0/docs/System-Mem-Weak.html によると Haskell の通常の値に対するファイナライザは非常にfragileとのことで、専用関数を持つ方を使うのが良さそうだが、ファイナライザを紐づけしつつ、touch的な関数で寿命を簡単確実に保証できる良い選択肢はどれだろう?

とりあえず、 Foreign.Concurrent.newForeignPtr nullPtr f して、touchForeignPtr で寿命を保証する感じにしたが……