(テキスト未定)
[topic:Haskell]
『本物のプログラマはHaskellを使う』読者の集い で、Haskell 連載についての講演を行ってきました。「連載の記事を参考に連載の記事の内容について説明する」のが主になっていたのであんまり参考になるかどうか分かりまませんが、とりあえず当日使った発表資料を以下に置いてきます。
[topic:Haskell]
ITpro に 本物のプログラマはHaskellを使う - 第31回 禁断の機能「unsafePerformIO」の深淵 が掲載されました。
これまで unsafePerformIO が危険だということを理由に、多くの unsafePerformIO の代わりに使える機能について語ってきました。しかし、ある機能が unsafePerformIO よりも適切に利用できる理由については語っていても、なぜ unsafePerformIO が危険なのかということ自体についてはあまり踏み込んだ説明をしてきませんでした。
unsafePerformIO の危険性は、プログラマが期待する処理と unsafePerformIO によって実際に行われる処理との食い違いから発生します。今回は「GHC の最適化機能の結果起こる様々な unsafePerformIO の振る舞い」と「unsafePeformIO の実装」を通して、こうした unsafePerformIO のような機能がどうプログラマの予想と食い違った結果を引き起こす可能性があるかということについて説明しました。
もちろん、unsafePerformIO の使用による危険は何も unsafePerformIO の振る舞いだけで発生するものではありません。unsafePerformIO で実行される I/O アクションによって生じる可能性もあります。流石に unsafePerformIO に関する説明を行う回でそうした問題を起こす可能性のある処理全てを説明することは不可能ですし、そもそも大きく脱線して unsafePerformIO の話ではなくなってしまうので、どうしても unsafePerformIO を使いたくなった時に守るべき規範を示すだけに留めることにしました。そうした unsafePerformIO が問題の直接的な原因ではない例については、I/O 処理を行う機能に対する説明や unsafePerformIO を使って定義されている機能に対する説明を行うところで個別に説明していくつもりです。