【関数型言語】名前渡し(call by name) と必要渡し(call bye need)

Scala 関数型デザイン&プログラミング http://amzn.asia/bIfSCQS

の「第5章 正格と遅延」に

Scalaの非正格かんすうは引数を値渡しではなく名前渡しでうけとります。

 という記述があった。「名前渡し」は初めて聞いたので、ぐぐった。

引数の値渡しと名前渡し - 宇宙野武士は元気にしているか

xawa雑記帳: [Scala] 名前渡し

いろいろな引数渡しの方式 — 値呼び・参照呼び・名前呼び・必要呼び

この中に、遅延評価と call by name, call by need の関係を説明している部分を見つけた。

いくつかの言語では,引数の計算を,その計算結果が使われるまで(自動的に) 遅らせる遅延評価(lazy evaluation)の仕組みが備わっている.遅延 評価の仕組みは,パラメータが複数回現れたときの処理の違いによって2種類 に分けられる.もっとも単純なやり方は,引数が使われる度に,thunk を thaw してして値を求めるもので,名前呼出し(call-by-name) と呼ば れ,Algol60 などで使われた.しかし,代入などの副作用が無い場合,くりか えし計算するのは同じ値が得られるだけで無駄である.これを改良したのが, Haskell などで採用された 必要呼出し(call-by-need) という仕組み で,一度 thaw した thunk はその値を覚えておいて,二度目以降に使われる ときには,覚えておいた値を使うものである.このふたつの機構は副作用がな い限り,同じ実行結果になる.しかし,代入などを使うと,このふたつの違い を見ることができる.

評価戦略 - Wikipedia

必要渡し(call by need) というのもあるらしい。Haskell で遅延評価のときに使われるらしい。

本物のプログラマはHaskellを使う - 第8回 遅延評価の仕組み:ITpro

こちらもまだ理解できていない。宿題。