2008-07-14
■[Haskell] 簡約(reduction)と参照透明性(referential transparency)
いま『ふつうのHaskellプログラミング』で Haskell を勉強しています
ちょっと難しくなってきたのでメモ
square n = n * n
この square 関数に引数を渡して、関数を評価した場合
square (1 + 3)
以下のように置き換えられる
→ (1 + 3) * (1 + 3) → 4 * 4 → 16
このように、関数の適用を定義で置き換える作業を簡約と言います
ただし、 Java の場合は以下のように評価されます
square (1 + 3) → square (4) → 4 * 4 → 16
このような評価方法を最内簡約と言います
Haskell の評価方法はその逆で最外簡約と言います
ただし、 Haskell の最外簡約では、引数は1度だけ評価されます
(1 + 3) x 2 が式を共有しているからです
このような、式を共有しつつ簡約する方法をグラフ簡約と言います
これが Haskell の遅延評価の概要です
それから、 Haskell には「ある式は、それと等しい値で置き換えられる」という
式を共有する仕組みがあるので、 (f 5) が 10 なら、同一スコープ内の (f 5) は 値10 に置き換えられます。
この性質を参照透明性と言います。
Java は同じ式でも毎回同じ結果が返るとは限らないため、参照透明ではありません。
トラックバック - http://d.hatena.ne.jp/faith_and_brave/20080714/1216026340
リンク元
- 11 http://www.google.com/reader/view/
- 10 http://cpp.ring.hatena.ne.jp/
- 9 http://blogs.wankuma.com/episteme/archive/2008/07/13/148660.aspx
- 9 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaUS283US283&q=オブジェクト 戻り値
- 8 http://d.hatena.ne.jp/keyworddiary/Haskell
- 8 http://reader.livedoor.com/reader/
- 8 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=random_shuffle&num=50
- 7 http://a.hatena.ne.jp/uskz/?gid=290138
- 7 http://www.google.co.jp/ig?hl=ja
- 6 http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla:ja:official&hs=JTR&q=c+++ファイル string+読み込み&btnG=検索&lr=lang_ja