SKIコンビネータでSKK = I(Ruby版)そのに

lambdaが入れ子になっているところをまとめてみました。だいぶ読み易くなりました。

def nlambda(n, xs = [], &f)
  if n <= 0
    f[*xs]
  else
    lambda {|x| nlambda(n - 1, xs + [x], &f) }
  end
end

I = nlambda(1) {|x      | x          }
K = nlambda(2) {|x, y   | x          }
S = nlambda(3) {|x, y, z| x[z][y[z]] }

p S[K][K][100] == I[100] # => true