函數式計算的理論基礎
Lambda 演算是阿隆佐·丘奇(Alonzo Church)在 1936 年發明的計算模型,與圖靈機等價,是函數式編程的理論基礎。與圖靈機從狀態和轉移的角度描述計算不同,Lambda 演算從函數的角度描述計算,強調函數的應用和代換。這一發現奠定了 Church-Turing 論點的基礎:任何「可有效計算」的函數都可以用 Lambda 演算或圖靈機來表示。
Lambda 演算的語法非常精簡,只有三種表達式:
項 (Term) ::= 變數 x
| λ 變數 . 項 (抽象/函數定義)
| (項 項) (應用/函數呼叫)
語法範例:
λx.x # 恆等函數:接受 x 並返回 x λx.λy.x # 雙參數函數(柯里化) (λx.x) y # 應用:將 y 傳給恆等函數
α 轉換 (Alpha Conversion):允許更改函數的參數名稱而不改變其語義。λx.M = λy.M[x/y]
β 歸約 (Beta Reduction):函數應用的核心規則。(λx.M) N → M[x/N],表示將 λx.M 應用於 N,相當於將 M 中的 x 替換為 N。
# β 歸約範例 (λx.x) y → y # 應用恆等函數 (λx.x) (λy.y) → λy.y # 函數作為參數 (λx.λy.x) a b → a # 柯里化應用
η 轉換 (Eta Conversion):反映函數的 extensionality 原則。λx.(M x) = M(前提:x 不在 M 中自由出現)。
Church 編碼是一種用 Lambda 演算表示資料結構的方法:
TRUE = λx.λy.x # 返回第一個參數 FALSE = λx.λy.y # 返回第二個參數 IF = λc.λx.λy.c x y # 條件選擇 AND = λp.λq.p q p OR = λp.λq.p p q NOT = λc.c FALSE TRUE
ZERO = λf.λx.x ONE = λf.λx.f x TWO = λf.λx.f (f x) SUCC = λn.λf.λx.f (n f x) # 後繼:n + 1 ADD = λm.λn.λf.λx.m f (n f x) # 加法:m + n MULT = λm.λn.λf.m (n f) # 乘法:m × n
Y Combinator 是實現遞迴的關鍵,允許在不具名遞迴的情況下定義遞迴函數:
Y = λf.(λx.f (x x)) (λx.f (x x))
這使得我們可以定義階層函數:fact = Y (λf n. if n==0 then 1 else n * f(n-1))