数字も関数で

Y の a については正確な理解はひとまずあきらめました(+_+) 頭から煙が出そうになるw
高階関数 + 再帰で、しかも複雑な式がどう展開されてるか追いかけるのは困難…。Haskell みたいな必要なところを必要なだけって評価のほうが脳に優しいのかも、とかはじめて思った。

昨日のコメントでも書いたけど、λの世界だと数も関数で表してしまうそうです。
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97

昨日とはちょっと違うけど JavaScript で。C# ってなんでラムダ式だと Func hoge = みたく T を許してくれないんだろう。それが書けても型なしλの世界を書くのは大変だけど。

var ch0 = function(f) { return function(x) { return x } }
var ch1 = function(f) { return function(x) { return f(x) } }
var ch2 = function(f) { return function(x) { return f(f(x)) } }

1 は 0 に一回 +1 したもの、2 は 二回 +1 したもの、…、みたいに次々に関数を適用したものを数と考えるみたい。それを一般化したのが↑。

x に 0、f に +1 する関数を与えると普通の数字にできる。

var a = ( ch0( function(n) { return n + 1 } ) )( 0 )
var b = ( ch1( function(n) { return n + 1 } ) )( 0 )

これをチャーチ数と呼ぶそうな。大きな数字を数えるのは遠慮したい世界だなぁw
id:amachang さんが似たようなことしてて助かってたり。