Haskell語言學習筆記(79)lambda演算

lambda演算

根據維基百科,lambda演算(英語:lambda calculus,λ-calculus)是一套從數學邏輯中發展,以變量綁定和替換的規則,來研究函數如何抽象化定義、函數如何被應用以及遞歸的形式系統。函數

lambda項

lambda演算由 lambda 項的語言構成。基本的 lambda 項只包含如下三種:code

語法 名稱 描述 Haskell語言中的相應表述
a 變量 表示參數或數學/邏輯值的字符或字符串 a
(λx.M) 抽象化 函數定義(M是一個lambda項)。
變量x在表達式中已被綁定。
(\x -> M)
(M N) 應用 將函數應用於參數。 M 和 N 是 lambda 項。 (M N)
  • 做爲 lambda 項的變量無須聲明
  • lambda 抽象化是一種匿名函數的定義。
  • lambda 應用即函數調用。
  • 括號能夠改變語義。
    λx.((λx.x)x)的含義是\x -> ((\x -> x) x),即總體是一個函數定義。
    (λx.(λx.x))x的含義是(\x -> (\x -> x)) x,即總體是一個函數應用。
    二者的最終結果都是(λx.x),即(\x -> x),可是語義不一樣。
lambda演算
(λf.f 3)(λx.x+2) = (λx.x + 2) 3 = 3 + 2
(λx.λy.x - y) 7 2 = (λy.7 - y) 2 = 7 - 2

Haskell
(\f -> f 3)(\x -> x+2) = (\x -> x + 2) 3 = 3 + 2
(\x -> \y -> x - y) 7 2 = (\y -> 7 - y) 2 = 7 - 2

Ω 與 Y 組合子

ω := λx.x x
Ω := ω ω
Y := λg.(λx.g (x x)) (λx.g (x x))遞歸

相關文章
相關標籤/搜索