タグ

ブックマーク / qiita.com/ruicc (2)

  • スペースリーク、その傾向と対策

    スペースリークの傾向とその対策を見ていきます。 ここでは3つのパターンを取り上げます。他のパターンがまだ見つかりそうな気がしているので、気がついた方は是非記事を書いてください。 注意事項 「サンクを積む」という表現を多用していますが、「関数適用によってサンクを大きくする」と言った意味合いで使っています。多分に誤用なので外では使わない方がいいと思います(と思ったらそういう表現を使うこともあるそうです) 以前の記事もそうですが、「簡約」は「評価」に統一してます 基方針 追記: 正格評価 無限ループをしない 必要ない式は評価しない 遅延評価 無限ループをしない 必要ある式はサンクを積まない サンクの必要とする空間と、潰した後の空間 サンクは必ずしも悪いものではありません。非常に大きなサンクの場合とそれを潰した場合に、どちらがメモリを消費するかは一概には言えないのです。 少し違いますが、わかりや

    スペースリーク、その傾向と対策
  • 正格評価と遅延評価(詳細編)

    さて基編に続き詳細編です。 動作を確認しながら細かく見ていきます。 Debug.Trace.trace 初めにtrace関数を導入しておきます。 こんな型の関数です。traceが評価されると、第一引数が標準エラー出力へ出力され、第二引数が返り値として返ります。 このtrace関数が単なる関数だということに注意してください。デバッグ用とはいえ何も魔法は使われていません。IO以外で標準エラー出力へoutputすることから、内部ではunsafeな関数が使われていますが。魔法が使われていない、というのは評価順序に関してです。つまり、trace自体が評価されなければ標準エラー出力への出力もありません。 trace "some string" 42をcaseで評価してみます。 結果は "heyhey!" という文字列が先に現れます。 caseによってtraceは評価され、42がその返り値です。 何が

    正格評価と遅延評価(詳細編)
  • 1