Yコンビネータなんか要らない

「計算論なんかチューリングマシンで十分だし、おれはチャーチじゃなくチューリングについていくぜ!Yコンビネータくそくらえ!」
という人もいるんじゃないでしょうか。
やっぱチャーチよりチューリングですよね。


という人のために、われらがチューリング先生がコンビネータを用意してくださっています。

Θ=(λx.λy.y(xxy))(λx.λy.y(xxy))

Groovyで書くとこうですね。

def th = {x -> {y-> y(x(x)(y))}}({x -> {y -> y(x(x)(y))}})


ためしにフィボナッチを。

> println th({f -> {n -> n < 2 ? n : f(n - 1) + f(n - 2)}})(7)
Exception in thread "main" java.lang.StackOverflowError

むむ、スタックオーバーフロー
ということで、遅延評価を込みこみます。

def th2 = {x -> {y-> y({m -> x(x)(y)(m)})}}({x -> {y -> y({m -> x(x)(y)(m)})}})


試してみます。

> println th2({f -> {n -> n < 2 ? n : f(n - 1) + f(n - 2)}})(7)
13

やりました!


Yコンビネータを使わなくても、λによる再帰ができました。
これで、もう一生Yコンビネータなぞに煩わされずにすみます。
ありがとうチューリング先生!