Haskellの簡約の実装とMemoTrieの秘密?
関数型言語では,グラフ簡約と最外簡約を行うと効率が良くなるらしい.
っていうのを
http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-R-%E3%83%90%E3%83%BC%E3%83%89/dp/4764901811
で読んだきがする.
だから,多分,Haskellも基本的にはグラフ簡約と最外簡約を行なっているはず.
したがって,次のフィボナッチ関数は遅いが.
fib 1 = 1 fib 2 = 1 fib n = fib (n - 1) + fib (n - 2)
*Main> fib 30 832040 it :: Integer (2.10 secs, 171727632 bytes)
グラフ簡約を使っていることを考えれば,下のように書けば,
各fibNは高々1回しか評価されないので,速い.
fib1 = 1 fib2 = 1 fib3 = fib2 + fib1 fib4 = fib3 + fib2 . . . (略) . . . fib38 = fib37 + fib36 fib39 = fib38 + fib37 fib40 = fib39 + fib38
*Main> fib30 832040 it :: Integer (0.00 secs, 525800 bytes)
多分,MemoTrieはこういうことを利用して,メモ化を行ってるのでは?
(ソースコード読んでみたけど,よく分からない)