函數式編程 (Functional Programming)

以函數為主的程式設計範式

什麼是函數式編程?

函數式編程(Functional Programming,FP)是一種編程範式,其核心思想是將計算視為函數的求值過程,並避免改變共享狀態和可變資料。函數式編程強調不可變性、第一類函數、聲明式編程和高階函數。這種編程範式隨著多核處理器和分散式系統的普及而變得越來越重要。

函數式編程的理論基礎可以追溯到 1936 年丘奇發明的 Lambda 演算。1958 年約翰·麥卡錫創建了 Lisp 語言(第一個函數式語言),1978 年羅伯特·米爾納創建了 ML 語言(第一個靜態類型系統的函數式語言),1990 年 Haskell 語言誕生。2000 年代以來,主流語言開始引入函數式特性。

核心概念

一等公民 (First-Class Functions)

函數是「一等公民」,可以作為參數傳遞、作為返回值、賦值給變數,以及存儲在資料結構中。這種特性使得高階函數成為可能,允許我們編寫更具抽象性的代碼。

不可變性 (Immutability)

資料一旦創建就不能被修改。與其在原資料上進行修改,我們創建新的資料結構來容納結果。不可變性消除了共享狀態引起的 bug,使並行編程更加安全。

純函數 (Pure Functions)

純函數的輸出只依賴於其輸入參數,不會產生副作用。相同的輸入總是產生相同的輸出,易於測試、調試和並行化。

高階函數模式

Map(映射):對集合中的每個元素應用一個函數,產生一個新集合。

Filter(過濾):根據謂詞函數的結果篩選集合中的元素。

Reduce(歸約):將集合中的所有元素歸約為單一值(也稱為 fold)。

Compose(組合):將多個函數組合成一個新函數。f ∘ g 表示「先應用 g,然後應用 f」。

Curry 化(Currying):將多參數函數轉換為單參數函數鏈。

範例:對 [1, 2, 3, 4, 5] 執行 Map(平方)→ [1, 4, 9, 16, 25],Filter(偶數)→ [2, 4],Reduce(求和)→ 15。

函數式資料結構與型態

函數式語言通常使用不可變的持續資料結構(Persistent Data Structures),所有版本都可以被高效地共享。Option/Maybe 型態用於表示可能存在也可能不存在的值,避免空指標異常。Either 型態表示成功或失敗兩種可能的結果,用於優雅的錯誤處理。

著名函數式語言

Haskell:最純粹的函數式語言,惰性求值、純函數式設計、強大的類型系統。

Lisp 方言:歷史最悠久的函數式語言,S-表達式語法,Clojure 是 JVM 上的現代實現。

Scala:結合函數式和物件導向,運行在 JVM 上。

F#:.NET 平台上的函數式語言,支援管道運算子。

現代主流語言如 JavaScript、Python、Rust 也越來越多地引入函數式特性。

本課程範例

相關連結