lambda函式if Y分鐘入門lambda演算

2021-10-11 13:53:40 字數 2572 閱讀 5811

本文為我個人對learn x in y minutes系列的lambda calculus部分內容的中文翻譯(首發部落格位址y分鐘入門lambda演演算法)。非常推薦有能力的讀者直接去閱讀原文。

包含部分譯者新增的細節補充

最初由alonzo church創造的lambda演算(λ-演算)是世界上最小的程式語言。雖然沒有數(number),字串(string),布林型(boolean)或其他任何非函式(non-function)的資料型別,但lambda演算能用於表示任何圖靈機。

lambda演算由3個元素組成:變數函式,和應用

最基本的函式是恒等函式:

求值通過β化簡(β-reduction)完成,本質上是詞法作用域的替換。

當對表示式

你甚至可以創造高階函式:

雖然lambda演算傳統上只支援單引數函式,但我們可以用一種被稱為柯里化(currying)的技巧來創造多引數函式。

有時 必須意識到傳統的lambda演算沒有數,字元,或任何非函式的資料型別!

在lambda演算中沒有true或false,甚至沒有1或0。

而是有:

首先,我們定義乙個if函式

,如果

為true返回

,如果為false返回

if等價於

譯者注在理論上這樣的做法在該演算系統沒有問題,但實踐中的if語句if a then b else c要求bc有且只有乙個被求值,在嚴格求值的語言(如scheme)中不可以通過定義普通的函式(lambda表示式)來實現真正的if語句,否則bc都會被求值,需要通過巨集或其他方法來改變求值行為。

使用if,我們可以定義基本布林邏輯運算子:

等價於

等價於

等價於

注意:

實質上是在說

譯者注not是一元運算子,我懷疑這裡原文寫錯了,應該是not a,當然後面lambda演算表示式是正確的。我已向該專案提交相應的issue等待回應。
雖然lambda演算沒有數字,但我們可以用church數來對數字編碼。

對於任意數n:

所以有為了增加乙個church數,我們用後繼函式(successor function)

即:使用後繼,我們可以定義加法:

挑戰:試著自己定義乘法函式

譯者注

寫完或者根本想不出來可以參考

section 1.1定義的mult函式,我就不直接寫出來干擾思考了。

譯者注

想快速入門lambda演算的看到這裡已經足夠,可以直接根據更多高階閱讀材料的前三條參考鏈結開始進一步學習。而從這裡開始和lambda演算的關係已經不是很大了,只是通過一系列化簡計算來把它用「更小」的演算系統表示,假設用

表示 語言的所有要素都可以用

語言來表示,即

可以被規約(化簡)到

,那麼接下來繁複的炫技演示了λ演算

ski演算

sk演算

ι演算的過程,語言的元素數量逐步減少。關於這些演算系統定義和發展的歷史以及它們的關係,除了接下來的內容外,也可以見wiki詞條combinatory logic

, 和

為以下函式:

我們可以把lambda演算中的表示式轉換為ski組合子演算中的表示式:

以church數2為例:

對於內部的

部分:所以

對於第乙個引數

對於第二個引數

把它們合併起來

展開它,我們最終會再次得到與church數2相同的表示式。

ski組合子演算還能被進一步化簡,注意到

我們可以移除

組合子。我們把所有

替換為

sk組合子演算依然不是最小的,定義

我們有a tutorial introduction to the lambda calculus

cornell cs 312 recitation 26: the lambda calculus

wikipedia - lambda calculus

wikipedia - ski combinator calculus

wikipedia - iota and jot

20分鐘入門 Lambda表示式(C )

本文章只提供快速入門教程,旨在幫助新手們 包括我自己 快速入門乙個相關知識,不包含詳細的知識點以及高階的技術用法。如有需要,可自行查詢更加詳細的資料。lambda表示式定義了乙個匿名函式,可以用來替代普通函式。作者認為lambda表示式只適用於簡單 短小的函式,如果函式邏輯比較複雜,最好還是定義乙個...

lambda入門使用

lambda表示式,其實本質來講,就是乙個匿名函式。因此在寫lambda表示式的時候,不需要關心方法名是什麼。實際上,我們在寫lambda表示式的時候,也不需要關心返回值型別。我們在寫lambda表示式的時候,只需要關注兩部分內容即可 引數列表和方法體 public class syntax lam...

匿名函式 lambda(一分鐘讀懂)

匿名函式 lambda 1.一種快速定義單行的最小函式 2.是從lisp借用來的,可以用在任何需要函式的地方 3.省去函式定義的過程 4.只用一次 普通模式 from functools import reduce deffn1 x,y return x y d reduce fn1,1 2,3 4...