{ if (n == 0) return 1; else-6ren">
gpt4 book ai didi

c# - 如何 : "letrec" in C# (lambda expression call within its definition)

转载 作者:行者123 更新时间:2023-11-30 16:30:34 25 4
gpt4 key购买 nike

考虑在方法主体中定义为 lambda 表达式并分配给变量的阶乘函数:

Func<int, int> factfail = n =>
{
if (n == 0)
return 1;
else
return n * factfail(n-1);
};

这失败了,因为 factfail 还没有被局部变量绑定(bind)。

有没有办法通过抽象函数本身来添加一种固定点?!

Func<Func<int, int>, int, int> fact_ = (fact, n) => 
{
if (n == 0)
return 1;
else
return n * fact(n-1);
};

fact_(??);

长话短说:我需要编写一个具有更改某些外部状态的副作用的递归函数。因此,我试图将该方法编写为捕获外部状态的 lambda 表达式。

我仍在尝试使用不同的风格来编写它,并且 - 除了所有递归调用都需要相同的字典之外 - 我希望尽可能纯函数式和懒惰。

所以我在玩 LINQ,因为它可以帮助我减少相互数据。它还有助于理解代码的哪些部分可以用函数式风格来表达。

在 LINQ 语句中简而言之,能够在前面定义一些辅助函数是很有帮助的,我通过将 lambda 表达式绑定(bind)到变量来做到这一点。

并且使用 lamda 表达式,我还可以捕获我的字典,而无需将其引用显式传递给该方法,这非常好。

不确定我是否在正确的轨道上......

最佳答案

您可以在 this blog post 中找到有关递归 lambda 表达式的更多信息由 Mads Torgersen 着。他展示了如何定义通常的定点组合器。他以阶乘函数为例,因此您可以在那里找到您的确切示例 :-)。

然而,在实践中,您可以只定义一个本地 Func<..>变量,然后对其进行变异。如果你想给委托(delegate)起一个名字,那么它工作得很好(有点脏,但很简单):

Func<int, int> fact = null;
fact = (n) => (n == 0) ? 1 : n * fact(n-1);

这是可行的,因为闭包捕获了对 fact 的引用变量,因此当您实际调用它时(在递归调用期间),该值不是 null不再,但引用委托(delegate)。

关于c# - 如何 : "letrec" in C# (lambda expression call within its definition),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com