Hatena::ブログ(Diary)

Faith and Brave - C++で遊ぼう このページをアンテナに追加 RSSフィード Twitter

2008-07-14

[] 簡約(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 は同じ式でも毎回同じ結果が返るとは限らないため、参照透明ではありません。



eldesheldesh 2008/07/17 09:44 → (1 + 3) * (1 + 3)
→ 4 * (1 + 3)
→ 4 * 4
→ 16
では?
haskellの(*)が正格なら別だけど

faith_and_bravefaith_and_brave 2008/07/17 10:02 なるほどー。
最初に左の (1 + 3) が評価されて、参照透明性によって右の (1 + 3) が 4 に置き換えられるんですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/faith_and_brave/20080714/1216026340