F# 程式設計入門 (1)
LISP 是第一個函數式語言,越來越多函數式語言隨之出現。真實世界的函數式語言無法像 Lambda Calculus 那樣,畢竟 Lambda Calculus 是讓虛幻不存在的機器執行的,沒有受到真實世界的限制。所以函數式語言雖然都是源自於 Lambda Calculus,但是卻都和 Lambda Calculus 之間存在差異。由於 FP 只是一些構想,各種語言實踐這些構想的作法,彼此之間也可能有不小的差異。
儘管各種語言有差異,但是大致上來說,FP 的特點在於:
* 「沒有副作用」(Side Effect)。在表示式(expression)內不可以造成值的改變。
* 「第一級函數」(First-Class Function)。函數被當作一般值對待,而不是次級公民,也就是說,函數可當作「傳入參數」或「傳出結果」。
基本上,遵守上述兩點進行程式編寫,差不多就可以稱為 FP。FP 和我們慣用的編寫程式風格,有相當大的差異。Imperative Programming 認為程式的執行,就是一連串狀態的改變;但 FP 將程式的運作,視為數學函數的計算,且避免「狀態」和「可變資料」。
為了提昇效率,許多函數式語言會納入 imperative 的某些作法(例如允許副作用),這類的 FPL 被稱為不純(Impure)的函數式編程語言,例如 Ocaml、F#、LISP、REBOL。當然也有一些語言堅持 Pure Functional 的作法,例如 Erlang、Haskell、Occam、Oz。
以往純的函數式語言會被某些人認為不實際,而不純的函數式語言,則被認為比較實際,但是最近大家的看法似乎有了改變。主要是以 Erlang 為首的純函數式語言,似乎更能充分展現出 FP 的優勢。FP 的優勢是容易進行單元測試、容易除錯、適合編寫(Concurrency)的程式。適合進行程式碼「熱抽換」或「熱部署」(Hot Code Deployment)。
除了上述的優點,我們可以透過 FP 作了些什麼,來瞭解 FP 是什麼。FP 語言常常能做下面的事:Higher-Order Function、Currying、Lazy Evaluation、Continuations、Pattern Matching、Closure、List Processing、Meta-Programming。如果你對這些觀念不太瞭解,可以查詢 Wikipedia 的說明。
微軟也注意到了 FP 的潮流。F# 的 F 是 Functional Language(函數式語言)的意思,# 是 .NET 的意思,所以顧名思義,F# 是 .NET 平台上函數式語言,由微軟官方所設計。F# 的血緣關係是 ML -> Caml -> OCaml(Objective-Caml)-> F#。同時 F# 也混入了一些 Haskell 和 C# 的語言特色。
沒有留言:
張貼留言