c# – 委托类型是否有用,它返回与自身类型相同的委托?

c# – 委托类型是否有用,它返回与自身类型相同的委托?,第1张

概述我在Visual Studio中摆弄,我发现了 delegate RecursiveDelegate RecursiveDelegate(); 是一个有效的委托定义. 我没有大量的函数式编程经验,但我想知道这种模式是否在函数式编程中真正有用,或者它是否仅仅是一种语义的好奇心.我想以两种方式提出这个问题: >在有副作用的情况下.我可以看到这实际上是一种在函数式语言中模拟迭代学习算法的中途方式,其中算 我在Visual Studio中摆弄,我发现了

delegate RecursiveDelegate RecursiveDelegate();

是一个有效的委托定义.

我没有大量的函数式编程经验,但我想知道这种模式是否在函数式编程中真正有用,或者它是否仅仅是一种语义的好奇心.我想以两种方式提出这个问题:

>在有副作用的情况下.我可以看到这实际上是一种在函数式语言中模拟迭代学习算法的中途方式,其中算法的实际任务作为副作用执行,并且函数的新版本是返回值.这样做了吗?
>在没有副作用的情况下.我认为这原则上没用,但如果我错了,我会非常好奇.如果我们假设RecursiveDelegate()的实现没有副作用,这可能有用吗?

解决方法 我有一个类似代码的例子,它不是一个递归委托,但它很接近. “Y-Combinator”非常接近 – 坦率地说,我不知道它在实践中是如何工作的,但它用于定义递归函数.

这是您需要定义的时髦代码:

public delegate T S<T>(S<T> s);public static T U<T>(S<T> s){    return s(s);}public static Func<A,Z> Y<A,Z>(Func<Func<A,Z>,Func<A,Z>> f){    return U<Func<A,Z>>(r => a => f(U(r))(a));}

现在,您可以在一行中定义递归函数.

阶乘:

var fact = Y<int,int>(_ => x => x == 0 ? 1 : x * _(x - 1));var fact5 = fact(5); // == 120var fact6 = fact(6); // == 720var fact7 = fact(7); // == 5040

斐波那契:

var fibo = Y<int,int>(_ => x => x <= 1 ? 1 : _(x - 1) + _(x - 2));var fibo5 = fibo(5); // == 8var fibo6 = fibo(6); // == 13var fibo7 = fibo(7); // == 21

代码中我最喜欢的行是调用s(s).说真的,如果有人能够把头脑中的那个拉直,那么他们就是天才!更不用说整个U< Func< A,Z>>(r => a => f(U(r))(a)).

总结

以上是内存溢出为你收集整理的c# – 委托类型是否有用,它返回与自身类型相同的委托?全部内容,希望文章能够帮你解决c# – 委托类型是否有用,它返回与自身类型相同的委托?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230094.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存