プログラミング Haskell 第12章 遅延評価 その2

遅延評価の章の後半です。

  • 12.6 部品プログラミングは無限リストと take などを組み合わせて、データを制御を切り離して記述できる遅延評価の強みについて
  • 正格適用 - $! 演算子をつかうと式を正格に評価する。つまり遅延評価しないで先に評価してからその値を利用する
    • f $! x という式だと x を評価して(この時の x 自体の評価は遅延評価される)、その結果の値に f を適用する
    • つまり $! は意味的には id (引数をそのまま返す)で、ただし正格な関数ということだと思います
  • 遅延評価はメモリを消費することがあるので正格演算子を使ってこれを抑制する
    • たとえば以下の2つのリストの和を計算する関数は簡約のされかたが異なるためメモリ消費量が違う。正格演算子を利用すると再帰のたびに加算が先に計算されるので加算の式を蓄積しなくてすむ
sumwith v [] = v
sumwith v (x:xs) = sumwith (v+x) xs

sumwith' v [] = v
sumwith' v (x:xs) = sumwith $!(v+x) xs