微軟從2002年開始研發F#,2005年推出第一個版本,現在的F#已經接近成熟。2007年底,微軟宣布將F#從研究室的專案轉移到產品部門,進入產品化的階段,在下一個版本的Visual Studio中,F#將會成為正式的一員,和C#、Visual Basic平起平坐。目前,F#也已經和Visual Studio做了初步的整合。

一個新語言的誕生,有它的時代背景,對F#來說,自然是函數式編程(FP,Functional Programming)的因素。事實上,除了具備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#程式。

函數式編程常用到的技巧包括:Higher-Order Function、Currying、Lazy Evaluation、Continuations、Pattern Matching、Closure、List Processing、Meta-Programming。令人驚訝地,F#對上述的支援都相當不錯。許多FP語言在這些方面可能還比不上F#完整。一開始寫F#程式,盡量多用這些技巧,寧可矯枉過正,這是學習的必經階段。

如果你想要開始習慣用F#寫FP程式,可以試著這麼做:
將Object為主的程式碼,轉回Procedure的方式:將Object化成Record;將Method轉成Function;將this(或self)當作Function的參數;把Function集中放到Module(模組)。

使用迴圈的地方,盡量轉成遞迴(Recursion)。先不要管執行效率的問題。

將用到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(Domain-Specific Language)」。我寫過一篇關於「GPL & DSL」的文章,但是這篇文章並沒有引起太多讀者的注意,顯然大家尚未意識到Meta-Programming的重要性,相當可惜。

F#對於Meta-Programming的支援相當好,有多種方式可以實作出DSL。有了F#,你不需要用到ANTLR這樣的外部工具,也可以建立自己的DSL。

如果你現在想學習F#的話,要特別注意,目前F#的文件寫得並不好──不完整、未更新而且凌亂。想透過閱讀官方的線上資料學習F#,效果可能不佳,你必須搭配閱讀APress出版的《Expert F#》,作者之一的Don Syme是F#計畫的負責人。

儘管目前文件上有缺失,但是F#已經轉移到產品部門,所以我相信不用多久,這些問題就會逐漸解決。

雖然F#已經推出3年,但是過去僅算是實驗室的專案,並不是商品。在TIOBE排行榜中,F#併入ML,目前ML排名第39,並沒有特別好的表現。不過,隨著F#商品化之後,應該就會改善,未來這幾年,F#勢必會漸漸逼近前20名。

整體來說,F#是很不錯的語言,程式開發人員如果能熟悉F#,應該可以提升軟體開發的生產力。身為微軟.NET家族的唯一FP語言,F#的地位相當特殊且重要。以F#的先進與方便,未來「說不定」會成為C#的強大競爭對手。有人甚至認為,使用過F#之後,就不會想用其他.NET語言,這是真的──至少對我來說是如此。

作者簡介:
蔡學鏞-技術顧問
清華大學資訊工程碩士,曾任華碩集團軟體工程師、元智大學資訊系講師、美商歐萊禮出版社技術編輯、臺灣微軟特約專欄作家。

熱門新聞

Advertisement