使用C#体验函数式编程之——Partial application(局部应用)

函数式编程

函数式编程是一种编程范式,着力于避免共享状态、可变数据和副作用产生,函数是第一等公民。

这与面向对象编程相反,在面向对象编程中,应用程序状态通常与对象中的方法共享和共存。

函数式编程是声明式的而不是命令式的,应用程序状态通过纯函数流动。

纯函数就是一个函数,并且这个函数有两种特性:

  • 函数的返回值只和给的参数有关,不随时间的变化而变化

  • 函数执行时无任何副作用

Partial Application

Partial Application是函数式编程中一个很常见的模式,它通过固定一个函数的部分参数,产生一个参数较少的函数。

例如有一个函数f(a, b, c), 我们可以传入参数ab, 使得函数f返回一个输入参数为c的函数。

这样的好处在于,简化输入,屏蔽对部分参数的赋值逻辑

C#实现

在C#里面Func没法通过只传递一个参数的方式来生成一个新的函数,在C#中声明一个三个参数的函数,调用的时候也没法只传入一个参数。

只能通过定义多个Func的方式实现,类似下面代码:

Func<int, int, int, int> add = (a, b, c) => a + b + c;
Func<int, int> add12 = (c) => add(1,2,c);Console.WriteLine(add(1,2,3));
Console.WriteLine(add12(3));

这样的定义非常不灵活,如果函数参数过多,最后的实现想想都很壮观:

5cc86874a4eb542f93f306887667dfd7.png

Curryfy

通过引用nuget包Curryfy,可以很容易地实现Partial Application:

using static Curryfy.PartialIncrementalFuncExtensions;var add12 = add.ApplyPartial(1, 2);Console.WriteLine(add12(3));

Partial Application的优势在于,可以传递任意位置的参数来生成一个新的函数,例如:

using static Curryfy.PartialSubsetFuncExtensions;
var add2 = add.ApplyPartial(arg1: 2);//设置第二个参数
Console.WriteLine(add2(1, 3));

或者按照参数位置传递,例如:

using static Curryfy.PartialDiscardFuncExtensions;
using static Curryfy.Discard;var add3 = add.ApplyPartial(_, _, 3);
Console.WriteLine(add3(1, 2));

结论

如果你经常使用默认参数,Partial Application无疑是一种更简单的实现方式。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最强的烧脑合集!能全都搞懂的只有天才!

▲ 点击查看牛津大学&#xff0c;全球学生削尖脑袋想进的地方。它真正吸引人的&#xff0c;不仅是雄厚的师资、精湛的学术&#xff0c;更因为立校800余年来&#xff0c;始终有一套经典、独门的“高智商训练”方法&#xff01;25位首相、53位总统、11位国王、47位诺贝尔奖得主&a…

github上面如何编辑README

github上面如何编辑README 今天把自己做好的 《手机摇一摇震动刷新(支持ListView、GridView、Webview)》上传到github,之前代码都上传好了,就差介绍了 第一步:找到READM.md文件进入编辑状态 找到了READM.md文件,修改一番以后,我想试下水,先提交看看,如…

开源Winform控件库:花木兰控件库

微信好友推荐&#xff0c;挺好看的Winfrom控件库&#xff0c;下面来看看。花木兰控件库Gitee截图介绍基于 C#&#xff08;语言&#xff09; 4.0 、 VS2019 、 Net Framework 4.0(不包括Net Framework 4.0 Client Profile) 开发的Winform控件库。为了兼容性采用了C#&#xf…

c语言题中的一些陷阱

1、求下列两个数组的长度关系characX[] "abcdefg";char acY[] { a, b,c, d, e, f, g };解析&#xff1a;对于字符串来说&#xff0c;字符串结尾默认为‘\0’&#xff0c;所以acX[]的长度为8&#xff0c;而第二个数组的大小长度为7&#xff0c;而且因为没有用‘\0’结…

“爱因斯坦兄弟”事件轰动纽约时报!双胞胎乱写博士论文,整容后越黑越红,竟然名利双收..........

全世界只有3.14 % 的人关注了爆炸吧知识只要够大就够震撼超模君前几天发了一篇文章《2020年最奇葩论文&#xff0c;打假网站看了都无语&#xff0c;原来外国人更擅长中医》&#xff0c;里面讲到的那篇奇葩论文&#xff0c;可真是让我见识到了什么叫做一本正经胡说八道&#xff…

Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码

手机摇一摇震动刷新 第一步:看摇一摇震动刷新的前后的效果图 1、摇一摇震动刷新前的效果图如下(图片太大了,分2次录屏的,如果看着不爽请猛戳我的github上面的演示) 2、摇一摇震动刷新之后的效果图如下 说明:我笔记本的虚拟机没有重力感应,所以用虚拟机摇一摇没反应…

搭建基于虚拟账号的电子邮件系统

使用postfix&#xff0c;cyrus-sasl&#xff0c;courier-authlib&#xff0c;mysql&#xff0c;dovecot&#xff0c;extmail&#xff0c;extman搭建电子邮件系统&#xff0c;可以使用web方式以虚拟账号注册登录邮箱&#xff0c;并且发送接受邮件&#xff0c;实现电子邮件功能。…

第一题

转载于:https://www.cnblogs.com/bilibiliganbei/p/5251796.html

此内容过于真实,引起强烈舒适

全世界只有3.14 % 的人关注了爆炸吧知识有这么一群人&#xff0c;年纪轻轻却有着远超同龄人或者常人的思想跟经验。其实&#xff0c;思想深度和年龄的关系并不大。饱读诗书的人&#xff0c;自然见识不凡&#xff0c;思考的内容也比别人更深刻。随着经历和阅历的增加&#xff0c…

Win11重磅新功能推送!

微软宣布现已开始向 Windows 11 正式版用户推出全新表情符号&#xff08; emoji &#xff09;&#xff0c;被称为“大眼夹”的经典 Office 助手&#xff08;Clippy&#xff09;现已回归&#xff01;全新表情符号基于流畅设计&#xff08;Fluent Design&#xff09;&#xff0c;…

话里话外:装备制造业企业迫切需要实现信息化综合集成

博主推荐延展咨询资深顾问 沈靓文章 装备制造企业产品具有单件产值大、技术含量高、生产周期长、完全个性化生产的特点&#xff0c;伴随着制造业整体水平的提高&#xff0c;近几年又兴起了异地制造、移动工厂等模式&#xff0c;而装备制造业现有的管理方式和信息化水平多不能适…

日本艺伎的拍照姿势,竟源于孔子?看完真的涨知识···

全世界只有3.14 % 的人关注了爆炸吧知识本文授权转载自公众号&#xff1a;艺非凡&#xff08;ID&#xff1a;efifan&#xff09;相信很多人都见过下面这个emoji表情&#xff1a;????????????没错&#xff0c;在风靡全球20余年的美剧《老友记》中&#xff0c;Ross决…

程序员如何把控自己的职业

这篇文章的主要内容主要是我今年3月份在腾讯做的直播&#xff0c;主要是想让一些技术人员对世界有一个大体的认识&#xff0c;并且在这个认识下能够有一个好的方法成就自己。而不是在一脸蒙圈的状态下随波逐流&#xff0c;而日益迷茫和焦虑。直播完后&#xff0c;腾讯方面把我的…

Spring学习笔记十二---泛型依赖注入

为什么80%的码农都做不了架构师&#xff1f;>>> package generic_di;import org.springframework.stereotype.Repository;Repository public class BaseRepository<T> {public void save() {System.out.println("Repository save ...");} }package…

女孩子狠起来可以多可怕?

1 让我康康是什么好吃的&#xff1f;▼2 抢答&#xff1a;他们到底能不能走出去&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 小朋友的眼睛是雪亮的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这该死的魅力▼5 我脚伤了&#xff0…

jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )...

1.页面切换&#xff08;data-transition&#xff09; 地址&#xff1a;http://api.jquerymobile.com/data-attribute/ data-transition fade | flip | flow | pop | slide | slidedown | slidefade | slideup | turn | none 褪色 | |翻转||流流行幻灯片| | | slidedown | s…

C# Socket编程笔记(转)

C# Socket编程笔记 http://www.cnblogs.com/stg609/archive/2008/11/15/1333889.html TCP Socket:Server 端连接步骤:new socket() -> bind() -> listen() -> accept() ->recv()/send() -> sockets.close() Client 端连接步骤:new socket() -> connect ->…

头上有多少根头发算秃头?

全世界只有3.14 % 的人关注了爆炸吧知识灵魂拷问你秃头了吗&#xff1f;超模君表妹秃不秃头一直都是模友关心的问题&#xff01;我想是时候讲讲秃头这个问题了&#xff01;阿里数据显示&#xff0c;在阿里零售平台买植发、护发东西的人中&#xff0c;80后占了38.5%&#xff0c;…

VS Code集成SandDance可视化分析数据

什么是SandDanceSandDance是微软研究院推出的数据可视化工具。SandDance通过触控式的界面&#xff0c;实现使用者和3D信息图表进行互动&#xff0c;更加特别的是可以以不同的角度不同的方式呈现分析结果&#xff0c;使用户可以通过可视化的方式更加直观的接受数据信息。基于易于…

android textview 中超出屏幕宽度的字符 省略号显示

2019独角兽企业重金招聘Python工程师标准>>> 当利用textview显示内容时&#xff0c;显示内容过多可能会折行或显示不全&#xff0c;那样效果很不好。今天发现android api中已经给出自动省略的功能。 实现如下&#xff1a; <TextView android:layout_width"f…