理想未来ってなんやねん

娘可愛い。お父さん頑張る。

Haskell 6日目

Haskell 6日目。

遅延評価の残りの部分です。

遅延評価のシミュレーション

本を見たままなので、割愛します。

遅延評価の利点と欠点

遅延評価の利点
  1. 不要な計算を減らせる
    • 遅延評価はどうしても必要な計算しか評価しないため、プログラムのいろいろなところで計算を減らすことができます。たらいまわし関数などはHaskellではCやJavaなどの言語に比べて高速に実行することが出来ます。
  2. 無限の長さのリストを扱える
    • Haskellではリストも遅延評価されるので、論理的に無限の長さを持つリストが扱えます。
  3. インターフェイスが統一できる
    • さまざまな処理をリスト処理に統一できます。Javaで書くならツリーに対するイテレータを用意するでしょうが、Haskellの場合には、ツリーの要素すべてを含むリストを返すflattenという関数が使われます。「ツリーの全要素に順番にアクセスする」という操作が、リストというデータ構造に置き換えられるようになります。したがって、Haskellではリスト処理さえ覚えておけばツリーの処理もこなせてしまいます。もちろん、Javaでも同じようにツリーの要素すべてをリストに集めて返すことは簡単に行えますが、巨大なツリーの場合をリストに集めるのはコストが高く掛かります。リストが遅延評価されるHaskellの場合はそのような心配がありません。
遅延評価の欠点
  1. 思った順番で操作を実行するのが難しい
    • 遅延評価では式が必要になるまで評価されないので、式がいつ評価されるのかわかりにくくなってしまいます。Haskellではアクションによってこの問題を解決します。
  2. デバッグしにくい
    • 遅延評価されているプログラムではスタックのバックトレースが意味をなさなくなります。JavaやCでは、デバッグの時にスタックトレースがとても役に立ちますが、Haskellではどのような順序で関数が評価されるのか予想がつかず、しかも、1つの関数内の式であっても、式ごとにバラバラの順序で評価されるため、JavaやCのようなスタックトレースが存在しないのです。この問題の対策としては、関数のテストを書くのが一番です。


今日のところはここまで。
明日は『6章 基本的な値』に進みます。