我试图弄清楚如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多).为此,我想到了使用Lambda Calculus的 Y组合器.
这是第一个定义:
Y = ?f.(?x.f(x x))(?x.f(x x))
Run Code Online (Sandbox Code Playgroud)
这是减少的定义:
Y g = g(Y g)
Run Code Online (Sandbox Code Playgroud)
我尝试用C#编写它们:
// Original
Lambda Y = f => (new Lambda(x => f(x(x)))(new Lambda(x => f(x(x)))));
// Reduced
Lambda Y = null; Y = g => g(Y(g));
Run Code Online (Sandbox Code Playgroud)
(Lambda是一个Func<dynamic, dynamic>.我首先尝试用它来键入它using,但这不起作用,所以现在它定义了delegate dynamic Lambda(dynamic arg);)
我的阶乘lambda看起来像这样(改编自这里):
Lambda factorial = f => new Lambda(n => n == 1 ? 1 : n * f(n - 1)); …Run Code Online (Sandbox Code Playgroud)