今日は、『The Little Schemer』の
- Chapter 9 ...and Again, and Again, and Again, ...
の後半(p160〜)を読んでいます。
今まで,何とか読み進めることができたのですが,難所に差し掛かってきました。Yコンビネータは難しいです…。
以下を参考に理解しようとしているのですが,まだまだ全然,自分のものにできません。
- http://www.loveruby.net/ja/misc/ycombinator.html
- http://www010.upp.so-net.ne.jp/okshirai/ycomb-j.html
- http://d.hatena.ne.jp/tanakaBox/20080203/1202023473
- http://d.hatena.ne.jp/kazu-yamamoto/20080402/1207127522
- http://d.hatena.ne.jp/amachang/20080124/1201199469
Yコンビネータの目的は,再帰するときに自分自身を名前で呼ばず,なんとかして名前を使わずに関数そのものを呼ぶようにさせたいということみたいです。
例えば,Rubyで階乗を求めようとすると,以下のように書くことができます。
def fact(n) if n == 0 1 else n * fact(n - 1) end end puts fact(5)
これを何とか,自分自身の名前を使わないようにするのが目的です。理解を深めるために,Rubyでやってみようと以下までは辿り着きました。これでも,自分自身を名前で読んでいないのですが,Yコンビネータと呼ぶには,まだまだ変形する必要があるんだと思います。難所は続きます…。
fact = lambda { |proc| lambda { |n| if n == 0 1 else n * proc.call(proc).call(n - 1) end } } puts fact.call(fact).call(5)