https://haskell.jp/blog/posts/2020/strict-gotchas.html
strictは!をつけてくれるのですが、!のseqではなくdeepseqに置き換えたい場合はどうすればいいでしょうか。
strictは!をつけてくれるのですが、!のseqではなくdeepseqに置き換えたい場合はどうすればいいでしょうか。
Control.DeepSeq.force
の組み合わせですかね!
をつけて回る」はそんなに害がないことが多いですが、「全ての関数のすべての引数 x
を !(force -> x)
に置き換える」はパフォーマンスにおいて基本的に有害なのでやめた方が良いかと思います。 deepseq
は、一度既に deepseq
済みのデータ構造であっても、データ構造全体をトラバースして評価済みであることを確認・保証するという動作をするので、一度されればもうコストがかからない seq
と違って、いつも何度でもデータ構造自体のサイズに比例した時間がかかります。let (p,q) =
let !(p,q) =
!
」を避けようとすると型でセーフガードをつける方に行っちゃうので…。