lua で Y コンビネータ
function Y(f) return function(a) return f(Y(f), a); end; end f = Y(function(f, n) if n <= 0 then return 1 else return n*f(n-1); end; end) f(10) # => 3628800
ふむふむ。
これを複数引数にするにはどうするか。とりあえず可変長引数を利用してみるがもうひとつ上手くない。もっと良い手がある気がするが、可変長引数を多値にして渡す方法がよくわからん。いったん可変長引数にしてしまうと多値にはならない気がする。
Y = function(f) return function(...) return f(Y(f), arg); end; end f = Y(function(f, tbl) local n = tbl[1]; local res = tbl[2]; if n <= 0 then return res else return f(n-1, n*res); end; end) f(10, 1) # => 3628800
うーん、もうひとつ美しくないなぁ。最大限の見積を考慮して10コくらいあらかじめ Y コンビネータ側で引数を持っておく手しかないのかな?
Y = function(f) return function(a, b, c, d, e) return f(Y(f), a, b, c, d, e); end; end f = Y(function(f, n, res) if n <= 0 then return res else return f(n-1, n*res); end; end) return f(10, 1) 3628800
引数上限5コ版。うーん美しくない。