using System; static class Program { interface Function { R apply(T t); } interface RecursiveFunction : Function, F> { } static class Functions { class Function : Program.Function { readonly Func _inner; public Function(Func inner) => this._inner = inner; public R apply(T t) => this._inner(t); } class RecursiveFunction : Function, F>, Program.RecursiveFunction { public RecursiveFunction(Func, F> inner) : base(inner) { } } public static Program.Function Create(Func inner) => new Function(inner); public static Program.RecursiveFunction Create(Func, F> inner) => new RecursiveFunction(inner); } static Function Y(Function, Function> f) { var r = Functions.Create>(w => f.apply(Functions.Create(x => w.apply(w).apply(x)))); return r.apply(r); } static void Main(params String[] arguments) { Function fib = Y(Functions.Create, Function>(f => Functions.Create(n => (n <= 2) ? 1 : (f.apply(n - 1) + f.apply(n - 2)))) ); Function fac = Y(Functions.Create, Function>(f => Functions.Create(n => (n <= 1) ? 1 : (n * f.apply(n - 1)))) ); Console.WriteLine("fib(10) = " + fib.apply(10)); Console.WriteLine("fac(10) = " + fac.apply(10)); } }