Haskell の遅延評価のメリット

遅延評価はそのデータが必要になるまで演算されません。
今までは具体的にはそのメリットを感じたことはなかったのですが、これは便利と思うことがあったので書いておきます。

> :m + Debug.Trace

-- 関数 func は2つの引数の和と積のタプルを返す関数です。
> let func a b =(trace("a+b")(a+b),trace("a*b")(a*b))

-- 引数に 10 と 20 を与えてfuncを呼ぶと(30,200)が返り、trace("a+b")とtrace("a*b")の文字列が表示されます。
> func 10 20
(30,200)
a+b
a*b

関数 func の返す値をx,yとします。

> let (x,y) = func 10 20
-- x が必要なときに a+b の演算が行われます。
> print x
a+b
30
-- y が必要なときに a*b の演算が行われます。
> print y
a*b
200

-- x も y も、値が決定して再度代入されることはありませんので、2回目からは演算が行われません。(遅延評価とは別)
> print x
30
> print y
200

タプルの片方しか必要のない場合でも、関数を変更する必要はなく、片方を捨ててしまえば良いのです。無駄な演算は行われません。

> let (_,y)=func 10 20
> print y
a*b
200