using Func = System.Func; using FuncFunc = System.Func, System.Func>; static class Program { struct RecursiveFunc { public System.Func, F> o; } static System.Func Y(System.Func, System.Func> f) { var r = new RecursiveFunc>() { o = new System.Func>, System.Func>((RecursiveFunc> w) => { return f(new System.Func((A x) => { return w.o(w)(x); })); }) }; return r.o(r); } static FuncFunc almost_fac = (Func f) => { return new Func((int n) => { if (n <= 1) return 1; return n * f(n - 1); }); }; static FuncFunc almost_fib = (Func f) => { return new Func((int n) => { if (n <= 2) return 1; return f(n - 1) + f(n - 2); }); }; static int Main() { var fib = Y(almost_fib); var fac = Y(almost_fac); System.Console.WriteLine("fib(10) = " + fib(10)); System.Console.WriteLine("fac(10) = " + fac(10)); return 0; } }