interface Function { public B call(A x); } public class YCombinator { interface RecursiveFunc extends Function, F> { } public static Function fix(final Function, Function> f) { RecursiveFunc> r = new RecursiveFunc>() { public Function call(final RecursiveFunc> w) { return f.call(new Function() { public B call(A x) { return w.call(w).call(x); } }); } }; return r.call(r); } public static void main(String[] args) { Function, Function> almost_fib = new Function, Function>() { public Function call(final Function f) { return new Function() { public Integer call(Integer n) { if (n <= 2) return 1; return f.call(n - 1) + f.call(n - 2); } }; } }; Function, Function> almost_fac = new Function, Function>() { public Function call(final Function f) { return new Function() { public Integer call(Integer n) { if (n <= 1) return 1; return n * f.call(n - 1); } }; } }; Function fib = fix(almost_fib); Function fac = fix(almost_fac); System.out.println("fib(10) = " + fib.call(10)); System.out.println("fac(10) = " + fac.call(10)); } }