微软从2002年开始研发F#,2005年推出第一个版本,而2008年的现在,F#已经接近成熟。2007年底,微软宣布将F#从研究室的专案转移到产品部门,进入产品化的阶段。在下一个版本的Visual Studio中,F#将会成为正式的一员,和C#丶Visual Basic平起平坐。目前,F#也已经和Visual Studio做了初步的整合。
一个新语言的诞生,自然有它的时代背景,对F#来说,自然是函数式编程(FP,Functional Programming)的因素。我已经在许多文章提到FP对现在IT环境的重要性,请自行上网查询阅读这些文章,我不在此重复叙述。
事实上,除了具备FP的能力,F#在Imperative Programming与OOP(物件导向编程)方面的能力,也是不打折的。因此,利用F#写程式,可以享有高度的自由,想用什麽样的paradigm,你可以自己作主。但如果完全不使用FP,那麽使用F#的意义不大,不如回头使用C#。
虽然F#比其他FP语言(Haskell丶Erlang丶Common Lisp)似乎更好学(因为语法比较不奇怪),但是一般人要善用F#并不容易,主要是FP的Paradigm和我们惯用的OOP与Imperative Programming不同。因此,熟悉F#的过程中,一开始最好强迫自己只用FP的方式写F#程式,不要用到OOP和Imperative Programming。
FP编程常用到的技巧包括了下面八点:Higher-Order Function丶Currying丶Lazy Evaluation丶Continuations丶Pattern Matching丶Closure丶List Processing丶Meta-Programming。令人惊讶地,F#对这八点的支援都相当不错。许多FP语言在这些方面可能还比不上F#完整。一开始写F#程式,尽量多用这些技巧,宁可矫枉过正,这是学习的必经阶段。
我认为,想要开始习惯用F#写FP程式,你可以开始做下面的事:
1. 将Object为主的程式码转回Procedure的方式:将Object化成Record,将Method转成Function,将this(或self)当作Function的参数,把Function集中放到Module(模组)。
2. 将程式中用到回圈的地方,尽量转成递回(Recursion)。先不要管执行效率的问题。
3. 将程式中用到if/else或switch/case的地方,改用Pattern Matching(模式比对)。
只要做到上述这三件事,你的F#程式会具有浓浓的FP风味。
F#由於是建构在.NET平台上,所以当然和.NET有天衣无缝的整合。事实上,F#所提供的互动式环境,对於学习.NET API来说,是相当不错的工具,比PowerShell更适合程式员使用。
由於F#的开发相当早(2002年),且F#比较是属於静态的语言,而不是动态的语言,所以目前F#并没有以.NET的DLR(Dynamic Language Runtime)为平台。未来F#会不会搬到DLR上头?情况还不明朗。
以往用FP开发的系统多以科学和财务为主,现在有了F#和.NET,应该可以为FP打开更广的应用领域。我相信,渐渐地会有人改用F#写.NET的各种应用(ASP.NET丶GUI丶LINQ)。
F#也是一种Language-Oriented Programming(语言导向编程)的语言。所谓的「语言导向编程」,就是Meta-Programming,也就是「可以建立自己的DSL」。我写过一篇关於「GPL & DSL」的文章,但是这篇文章并未得到太多读者的注意,显然大家并没有意识到Meta-Programming的重要性,相当可惜。
F#对於Meta-Programming的支援相当好,有多种方式可以实作出DSL。有了F#,你不需要用到ANTLR这样的外部工具,也可以建立自己的DSL。
如果你现在就想学习F#的话,要特别注意。目前F#的文件写得并不好,不完整丶未更新丶且凌乱。想透过阅读官方的线上资料来学习F#,能学会F#的机会不高。必须读APress出版的Expert F#这本书。此书作者之一Don Syme是F#计画的负责人。
虽然目前文件上有缺失,但是因为F#已经转移到产品部门,所以我相信再不用多久,这些问题就会逐渐解决。
虽然F#已经推出三年,但是过去仅算是实验室的专案,并不是商品,所以在Tiobe排行榜上面并没有特别好的表现。在商品化之後,应该就会改善。在Tiobe排行榜中,F#并入ML中,而目前ML在排行榜中是39。未来这几年,势必会渐渐逼近20名。
整体来说,F#是很不错的语言,熟悉F#之後应该可以提升软体开发的生产力。身为微软.NET家族的唯一FP语言,F#的地位相当特殊而重要。以 F#的先进与方便,未来「说不定」会成为C#的强大竞争对手。有人甚至认为,使用过F#之後,就不会想用其他.NET语言了。这是真的...至少对我来说是如此。
转载于:https://www.cnblogs.com/highmayor/archive/2009/02/13/1390086.html