2025:函數式程式語言的未來展望#
事件#
2025 年回顧,函數式程式設計已不再是學院內的支流:不可變性、代數資料型別、pattern matching、型別驅動開發全面滲透主流語言;依值型別與定理證明器(以 Lean 為首)與 AI 結合,正在改寫數學與軟體驗證的工作方式;effect systems、WebAssembly、多核執行環境則為函數式語言開闢新的戰場。
語法/特性加入的理論與實用原因#
1. 函數式概念的全面滲透#
- Rust:ownership/borrowing 可視為對「記憶體安全的函數式不變量」的線性型別工程化(理論上承襲 linear types 與 region inference);enum +
match即代數資料型別 + pattern matching。 - Swift:value semantics、enum with associated values、
Result、async/await——不可變為預設的語義來自 Clojure 以來的風潮。 - Kotlin / Java:records(JEP 395/440)、sealed types(JEP 409)、pattern matching for switch(JEP 441)——Java 正在補上 1970 年代 ML 就有的 ADT 與 pattern matching。
- C++:
std::optional、std::variant、std::expected(C++23)、ranges(C++20)——以函式庫補上代數資料型別與組合子風格。 - TypeScript:discriminated unions 與 exhaustiveness checking,即 ML 型別系統的 TypeScript 化。
- 理論原因:代數資料型別與 pattern matching 有明確的型別論基礎且易於形式化。
- 實用原因:以資料建模取代繼承層次,編譯器可檢查窮舉性,重構安全。
- 彌補缺陷:物件導向的 null、繼承、side effect 問題。
// Java 21:ADT + pattern matching
sealed interface Shape permits Circle, Rect {}
record Circle(double r) implements Shape {}
record Rect(double w, double h) implements Shape {}
double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Rect r -> r.w() * r.h();
}; // 編譯器保證窮舉
}
Rust 的 enum + match 同樣是 ML 式的 ADT 與窮舉檢查,所有權則是線性型別的工程化:
// Rust:enum(ADT)+ match(pattern matching,編譯器保證窮舉)
enum Shape {
Circle { r: f64 },
Rect { w: f64, h: f64 },
}
fn area(s: &Shape) -> f64 {
match s {
Shape::Circle { r } => std::f64::consts::PI * r * r,
Shape::Rect { w, h } => w * h,
} // 少寫一個變體直接編譯錯誤
}
C++ 以函式庫補上「不會當機的回傳型別」與組合子風格:
// C++23:std::expected 取代例外,ranges 提供組合子風格
std::expected<int, std::error_code> parse(std::string_view s);
auto result = parse("42")
.transform([](int n) { return n * 2; }) // 有值才轉換
.value_or(0); // 失敗給預設值,不需 try/catch
2. AI 時代的定理證明與形式化驗證#
- 理論原因:Curry–Howard 對應使「證明」成為可機器檢查的物件;Lean 的嚴格核心為 AI 產出提供裁決基準。
- 實用原因:2024 年 AlphaProof(Lean)達 IMO 銀牌、2025 年 Gemini Deep Think 等系統達金獎水準;mathlib 的規模使 LLM 有大量訓練語料; Terence Tao 等數學家開始日常使用 Lean 工具鏈。
- 實用案例:可預期「AI 起草、Lean 驗證、人類審閱」將成為數學研究與關鍵軟體驗證的標準工作流程。
- 彌補缺陷:傳統軟體測試無法證明正確性;人類審稿無法窮盡證明的每一步。
3. Effect systems(效果系統)#
- 理論原因:把副作用編碼進型別(row polymorphism + effect rows),是 Haskell IO monad 的推廣——「不純」變成可細粒度標注的型別。
- 實用原因:Koka(Microsoft Research,2023 年發布 Koka 3)、Unison(2023 年公開版,content-addressed code)、Roc(2020 年代活躍開發)都以效果或能力型別為核心賣點。
- 彌補缺陷:monad transformer 堆疊的心智負擔;副作用在主流語言中不可見的問題。
Koka 把副作用編碼進函式型別,effect handler 則可攔截與改寫效果的解釋:
// Koka:副作用寫進型別(<console|e> 標注會產生哪些效果)
fun greet() : <console|e> io ()
println("hello")
fun silence() : <e|> () // 攔截 console 效果,使其消失
with handler
handler console { println(msg) -> () } // 效果處理器改寫 println
greet() // 型別層面保證:此呼叫不再有 console 效果
Unison 以內容定址(content-addressed code)與能力系統重新思考程式部署:
-- Unison:能力系統(ability)明確標注副作用,與 Koka 效果系統同理
type Console = { putStrLn : Text -> {Console,Exception} () }
greet : '{Console, Exception} ()
greet = putStrLn "hello"
-- 沒有提供 Console 能力就無法呼叫 putStrLn,副作用在型別中無所遁形
TypeScript 的 discriminated unions 以型別標記取代 null 檢查:
// TypeScript:discriminated union + 窮舉檢查
type Shape =
| { kind: "circle"; r: number }
| { kind: "rect"; w: number; h: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.r ** 2;
case "rect": return s.w * s.h;
}
}
4. WebAssembly 與多核執行環境#
- 理論原因:WASM 的線性記憶體與能力模型天然接近函數式的資源管理觀。
- 實用原因:OCaml 5.2(2024)帶來 multicore(effects handlers + domains)與 wasm 後端;GHC 的 WebAssembly 後端(2023 起)使 Haskell 可跑在瀏覽器;F#、Scheme(WASM GC 提案)也陸續支援。
- 彌補缺陷:函數式語言長期難以觸及前端與沙盒環境;OCaml 長期缺乏並行原語。
OCaml 5 的 effect handler 與 domain 提供輕量並行原語:
(* OCaml 5:effect handler(multocore)——可恢復的效果 *)
type _ Effect.t += Print : string -> unit Effect.t
let main () =
Effect.perform (Print "hello")
let () =
try_with main ()
{ effc = fun (type a) (e : a Effect.t) ->
match e with
| Print s -> Some (fun (k : (unit, a) continuation) ->
print_string s; continue k ()) -- 攔截後恢復 continuation
| _ -> None }
總結發展主軸與預測#
自 1936 年 lambda 演算、1958 年 LISP 以來,函數式程式設計的發展主軸是「理論先於工程數十年,再逐波滲透主流」:1958–1970 年代(LISP、ML)建立 lambda、GC、巨集與型別推導;1980–1990 年代(SML、Haskell、GHC)建立純函數式與惰性求值;2000 年代(Scala、Clojure、F#)把函數式帶上 JVM 與 .NET;2010 年代(Idris、Lean)把依值型別帶入實用;2020 年代則是「函數式 + 依值型別 + AI」的三線合流。可以預測:不可變性與 ADT 將成為所有主流語言的預設;Lean 式的形式化驗證將與 LLM 共生成為軟體品質的基礎設施;effect systems 與 WASM 將孕育下一代的系統級函數式語言。