haskell-jp / beginners #19 at 2021-12-20 01:49:34 +0900

unsafePerformIO は禁断だとか型安全性を壊すとかヤバいとかいう話はよく見かけるのですが、実際に`unsafePerformIO` が使われる場面ってどんなのがあるのでしょうか
デバッグのためです。一番有名なところだと
Debug.Traceモジュールの関数です。
ソース: https://hackage.haskell.org/package/base-4.16.0.0/docs/src/Debug.Trace.html#trace
「全能すぎる」型の機能を制限したら IO 値関数が純粋な関数と思えるようになった、みたいな時に、 IO 関数を純粋関数に変換するためにも使える気がします。 vector パッケージの Data.Vector.Storable モジュールとか bytestring パッケージとかが好例ですが、 bytestring なんかは unsafePerformIO よりもっと危険な関数を使っているので、昔はよくバグっていたみたいです。
stdin, stdout, stderr :: Handle の実装でも使われていますね.
https://hackage.haskell.org/package/base-4.14.3.0/docs/GHC-IO-Handle-FD.html
C言語とかとのFFIは方が保証してくれないのでどうにもならないことはあると思います
自分がコード読んでいく中で「これ仕方なくなくない?本当に必要か?」と思った選手権No1は
https://github.com/yesodweb/shakespeare/blob/7f0f9d3aca5140e09ac55cf7ebf248feb47d0bd4/Text/Hamlet.hs#L575
ですかね