mugyu
5/4/2012 - 11:19 AM

Rubyで無名再帰(Zコンビネータ)

Rubyで無名再帰(Zコンビネータ)

# Zコンビネータ
def Z(func)
  lambda do |f|
    lambda{|x|lambda{|y| f[x[x]] [y]}}[
      lambda{|x|lambda{|y| f[x[x]] [y]}}]
  end[func]
# .callメソッドで書くとこう
#  lambda do |f|
#    lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}}.call(
#      lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}})
#  end.call(func)
end

# フィボナッチ数
fib = Z(lambda{|f|lambda{|n| n < 2 ? n : f[n - 2] + f[n - 1]}})
p fib.call(7) # 1, 1, 2, 3, 5, 8, 13, ...