Tag: y combinator

“匿名递归”在.NET中有效吗? 它在Mono中

几天前我在“C#匿名递归”中浏览了这个网站。 本文的主旨是以下代码在C#中不起作用: Func fib = n => n > 1 ? fib(n – 1) + fib(n – 2) : n; 然后,文章详细介绍了如何使用currying和Y-combinator回到C#中的“Anonymous Recursion”。 这非常有趣,但我担心我的日常编码有点复杂。 至少在这一点…… 我喜欢看自己的东西所以我打开了Mono CSharp REPL并输入了该行。 没有错误。 所以,我进入了fib(8); 。 令我惊讶的是,它奏效了! REPL以21回复! 我想也许这可能是REPL的一些魔力,所以我解雇了’vi’,输入以下程序,然后编译它。 using System; public class Program { public static void Main(string[] args) { int x = int.Parse(args[0]); Func fib = n => n […]

替代Y组合子定义

我最近花了一些时间围绕Y组合器,我发现它通常定义(或多或少)如下(这是在C#中,但选择的语言并不重要): public delegate TResult SelfApplicable(SelfApplicable r); public static TResult U(SelfApplicable r) { return r(r); } public static Func Y(Func<Func, Func> f) { return U<Func>(r => arg1 => f(U(r))(arg1)); } 虽然这是完美的function(双关语),但似乎我的定义更简单: public static Func Y(Func<Func, Func> f) { return f(n => Y(f)(n)); } 有没有理由说后一个定义不常见(我还没有在网上找到它)? 它可能与定义Y本身有关吗?

在C#中使用Y Combinator

我试图弄清楚如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多)。 为此,我想到了使用Lambda Calculus的 Y组合器 。 这是第一个定义: Y = λf.(λx.f(xx))(λx.f(xx)) 这是减少的定义: Y g = g(Y g) 我尝试用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)); ( Lambda是一个Func 。我首先尝试使用usedef它,但这不起作用 ,所以现在用delegate dynamic Lambda(dynamic arg); ) 我的阶乘lambda看起来像这样(改编自这里 ): Lambda factorial = f […]

我是否使用C#动态实现了Y-combinator,如果没有,那么它是什么?

我的大脑似乎处于自虐模式,因此在被淹死之后, 这个和它 ,它想要在C#中使用一些DIY。 我想出了以下内容,我认为它不是Y-combinator,但似乎设法使递归递归的函数没有引用自身: Func<Func, Func> Y = x => x(x); 所以给出这些: Func<dynamic, Func> fact = self => n => n == 0 ? 1 : n * self(self)(n – 1); Func<dynamic, Func> fib = self => n => n < 2 ? n : self(self)(n-1) + self(self)(n-2); 我们可以生成这些: Func Fact = Y(fact); Func Fib […]