c# – 委托类型是否有用,它返回与自身类型相同的委托?
发布时间:2020-12-15 21:55:12 所属栏目:百科 来源:网络整理
导读:我在Visual Studio中摆弄,我发现了 delegate RecursiveDelegate RecursiveDelegate(); 是一个有效的委托定义. 我没有大量的函数式编程经验,但我想知道这种模式是否在函数式编程中真正有用,或者它是否仅仅是一种语义的好奇心.我想以两种方式提出这个问题: 在
我在Visual Studio中摆弄,我发现了
delegate 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); // == 120 var fact6 = fact(6); // == 720 var fact7 = fact(7); // == 5040 斐波那契: var fibo = Y<int,int>(_ => x => x <= 1 ? 1 : _(x - 1) + _(x - 2)); var fibo5 = fibo(5); // == 8 var fibo6 = fibo(6); // == 13 var fibo7 = fibo(7); // == 21 代码中我最喜欢的行是调用s(s).说真的,如果有人能够把头脑中的那个拉直,那么他们就是天才!更不用说整个U< Func< A,Z>>(r => a => f(U(r))(a)). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 简化document.createElement("div")动态生成层方法
- c# – 使用ExpressionVisitor停止遍历
- ruby-on-rails – 为每个域i18n语言环境设置语言环境的Rail
- ruby-on-rails – 为什么我的关联类型不匹配?
- ruby-on-rails – ActiveRecord:定义关联时,将类而不是字符
- Flux --> Redux --> Redux React 入门 基础实例使用
- 当对象可能为零时,如何尝试在Ruby中迭代Hash?
- cocos2d-x之__Array:: createWithContentsOfFile引发的“血
- Swift 项目使用 CoreData 可能会碰到的 32 位系统问题
- AJAX - $().load(url,data,function(response,status,xhr))