F#语言实例分析


这篇文章主要讲解了“F#语言实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“F#语言实例分析”吧!在F#编写一个两个数相加的函数,在F# Interactive中输入:1letadd num1 num2=num1*num2;;F# Interactive为我们推断了这个函数类型:val add : num1:int -> num2:int -> int,表示add有两个int类型的参数得到了1个int类型。函数当作参数:123456//C#privateintTwice(intinput,Func f){returnf(f(input));}varresult = Twice(2, n => n*n);使用F#则只需要非常简洁的一个函数声明:123456> lettwice (input:int) f=f(f(input));;valtwice : input:int -> f:(int -> int) -> int> twice 2 (funn->n*n);;valit : int = 16val twice : input:int -> f:(int -> int) –> int 这句话则是F# Interactive给出的推断:twice函数需要一个int参数和一个(int->int)的函数作为参数,返回一个int.这两个例子仅仅是热身,并不是本篇博客的重点,所以你觉得前两个例子很无聊或者没太看明白请继续看下面的总结。场景:某种活动会有一个日程安排(Schedule),日程安排有3中类型,只举办一次(Once),每天一次(Daily),每周一次(Weekly)。活动会根据日程安排(Schedule)的类型不同具有不同的宣传内容,不同的延期举行策略。你对于这样的场景会有怎么样的思考呢?一、面向过程类型的编码方式面向过程类型的编码是需求的直译过程,代码会写成这样:1.显示活动的宣传内容:1234567891011121314151617publicvoidShowScheduleDescriptions(){switch(ScheduleType){caseScheduleType.Once:Console.WriteLine(“this is once activity”);break;caseScheduleType.Daily:Console.WriteLine(“this is daily activity”);break;caseScheduleType.Weekly:Console.WriteLine(“this is weekly activity”);break;default:thrownewInvalidOperationException(“unsupported schedule”);}}这样的代码初次看起来没什么问题,实际存在两个危险信号:违反开放封闭(OCP)原则,如果有一天需要加入一种Monthly类型,无疑需要修改这个方法;这样的代码风格会让接下来的开发者不假思索的进行延续,比方说需要根据不同的活动类型延期活动;2. 延期活动:1234567891011121314151617publicvoidDelaySchedule(){switch(ScheduleType){caseScheduleType.Once:Console.WriteLine(“Delay one hour”);break;caseScheduleType.Daily:Console.WriteLine(“Delay one day”);break;caseScheduleType.Weekly:Console.WriteLine(“Delay one week”);break;default:thrownewInvalidOperationException(“unsupported schedule”);}}这样的代格违反了DRY原则,相同的代码框架却无法重用。二、面向对象的编码方式对于一个有经验的OO开发者,一旦看到switch,if(type=typeof(…))之类的代码马上会提高警惕,是不是有一些抽象类型没有被找出来?在这个例子中则会找出下面的抽象:1234567891011121314151617181920212223242526272829303132333435363738publicclassSchedule{publicvirtualvoidShowShowScheduleDescriptions(){}publicvirtualvoidDelaySchedule(){}}publicclassOnceSchedule : Schedule{publicoverridevoidShowShowScheduleDescriptions(){Console.WriteLine(“this is once activity”);}publicoverridevoidDelaySchedule(){Console.WriteLine(“Delay one hour”);}}publicclassDailySchedule : Schedule{publicoverridevoidShowShowScheduleDesc免费云主机域名riptions(){Console.WriteLine(“this is daily activity”);}publicoverridevoidDelaySchedule(){Console.WriteLine(“Delay daily day”);}}//… other schedule这样的代码很好的解决了面向过程代码的两个问题,看起来更加具有扩展性,随着新类型的Schedule引入,旧的代码完全不用改动。当然事情也不是绝对的,什么情况下需要改动旧代码呢?当需要扩展Schedule的行为的时候,例如需求升级,不同的Schedule具有不同的举办方式,我们不得不在每种Schedule中加入一个 void Hold()方法。三、函数式解决方案函数式语言则使用可区分联合和模式匹配来处理此类问题。定义一个Schedule可区分联合:1234typeSchedule=| Once ofDateTime| Daily ofDateTime*int| Weekly ofDateTime*int这个类型既说明了Schedule有三个不同的类型,同时定义了三种类型分别具有的数据结构。像是Enum和类的综合体,但是又显得特别精致。1.显示活动的宣传内容,使用了模式匹配:12345letShowShowScheduleDescriptions schedule=matchschedule with| Once(DateTime)-> printfn “this is once activity”| Daily(DateTime,int)->printfn “this is daily activity”| Weekly(DateTime,int)->printfn “this is weekly activity”这个方法类似于switch…case,但是通过匹配可区分联合来实现,而不是通过一个显示的Enum来实现。2. 延期活动:12345letDelaySchedule schedule=matchschedule with| Once(DateTime)-> printfn “Delay one hour”| Daily(DateTime,int)->printfn “Delay one day”| Weekly(DateTime,int)->printfn “Delay one week”函数式编程的解决方案认为可以很方便的添加新的行为,例如增加新的行为:Hold()。通过定义可区分联合和模式匹配来完成编码,整个解决方案像是面向过程和面向对象的一种结合体,但是侧重点不同,实现的代码也更加精致。感谢各位的阅读,以上就是“F#语言实例分析”的内容了,经过本文的学习后,相信大家对F#语言实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: python QT界面关闭线程池的线程跟随退出问题怎么解决

今天小编给大家分享一下pythonQT界面关闭线程池的线程跟随退出问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。定义一个全局变量,默…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 04/06 18:19
Next 04/06 18:20

相关推荐