簡約(reduction)と参照透明性(referential transparency)

いま『ふつうのHaskellプログラミング』で Haskell を勉強しています


ちょっと難しくなってきたのでメモ

square n = n * n

この square 関数に引数を渡して、関数を評価した場合

square (1 + 3)

以下のように置き換えられる

→ (1 + 3) * (1 + 3)
→ 4 * 416

このように、関数の適用を定義で置き換える作業を簡約と言います


ただし、 Java の場合は以下のように評価されます

square (1 + 3)
→ square (4)
→ 4 * 416

このような評価方法を最内簡約と言います

Haskell の評価方法はその逆で最外簡約と言います


ただし、 Haskell の最外簡約では、引数は1度だけ評価されます

(1 + 3) x 2 が式を共有しているからです

このような、式を共有しつつ簡約する方法をグラフ簡約と言います


これが Haskell遅延評価の概要です



それから、 Haskell には「ある式は、それと等しい値で置き換えられる」という
式を共有する仕組みがあるので、 (f 5) が 10 なら、同一スコープ内の (f 5) は 値10 に置き換えられます。
この性質を参照透明性と言います。
Java は同じ式でも毎回同じ結果が返るとは限らないため、参照透明ではありません。