c# - 我们需要 C# 中的定点组合器吗?

标签 c# functional-programming lambda

我在 C# 中使用递归 lambda 并在网络上找到了两种实现此目的的方法。一种方法使用 fixed point combinator而另一个则没有。在下面的代码中,f1 是使用组合器构建的,而 f2 是直接定义的。我的问题是,我们是否需要 C# 中的定点组合器,或者该语言已经提供了我们所需的一切,所以我们可以不用管它们?

class Program
{
    static Func<T, T> F<T>(Func<Func<T,T>,Func<T,T>> f)
    {
        return x => f(F(f))(x);
    }

    static void Main(string[] args)
    {
        Func<Func<int,int>,Func<int,int>> f = fac => x => x == 0 ? 1 : x * fac(x - 1);
        var f1 = F(f);

        Console.WriteLine(f1(5));

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

        Console.WriteLine(f2(5));
    }
}

最佳答案

因为我们可以为方法命名,这意味着该语言已经内置了对递归的必要支持。

请注意,您的问题中给出的第二种方法涉及在引入变量后更改变量的值,使其不是“纯”函数式编程。 只有当你的函数微积分系统没有内置的函数概念时,Y 组合器才是必需的,该函数可以在定义完全定义之前通过名称引用它自己的定义。 C# 有两种直接执行此操作的方法:1. 最初将函数变量定义为 null 和 2. 声明一个普通的命名方法(迄今为止首选技术)。

关于c# - 我们需要 C# 中的定点组合器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758082/

相关文章:

c# - 如果在 C# 中按名称搜索,如何从表中选择行?

javascript - 使用 fp-ts 删除 Either 数组中的重复项

c# - 迭代器的 Lambda 捕获问题?

scala - 在 Scala 中执行元组之外的函数

c# - .NET 4.0 项目无法在 Windows xp 上运行

c# - 如何检测客户端是否可以访问 iFrame 中的网站?

scala - FS2 Stream 异常处理不起作用

python-2.7 - 如何用lambda表达式初始化字典中的键、值对?

C# 限制列表框项目

javascript - 如何在 Javascript 中实现可靠、通用且类型安全的函数?