關於無類型限制的lambda演算

關於無類型限制的lambda演算

在閱讀這篇博文之前,你最好已經閱讀過A Tutorial Introduction to the Lambda Calculus (Raul Rojas)

在接觸Haskell幾個月之後,才發覺Haskell不過是一個實現pattern match比較方便的工具,真正值得深入學習不僅有Haskell的實現和函數式編程的思想,還包括如下的內在理論知識:lambda演算,圖靈機,語言和文法,符號系統,類型系統等等(目前還沒有對這些內容進行系統學習,所以不能保證列出的順序是正確的學習路線)。在這其中最基礎的就是lambda演算。

lambda演算其實分成兩派:帶類型系統的和不帶類型系統的。前者即聲明出來的函數均有一個有限的、非遞歸的類型,主要用於程序語言理論,這裏暫時不介紹了。後者是下文談論的重點。

不帶類型系統的lambda演算,理論框架是這麼搭的:

  • 首先,通過類似文法定義的方式定義了函數的概念,以及針對其形式而自然產生的一些問題進行了說明(比如自由變量和約束變量)。
  • 基於函數定義了一些概念,證明這些概念可以基於函數進行定義。比如T/F/有關運算,自然數集/有關運算,等等。

(不帶類型系統的)lambda演算和抽象代數很像。

  • 抽象代數是從集合出發,首先不加定義地給出了元素、集合、屬於的概念,然後根據這幾個概念提出新的定義(比如關係->運算->代數系統),從而構建整個抽象代數的理論體系,使很多(在數學中)有用的概念具有標準化定義。
  • lambda演算是先通過類似文法產生式的方式給出了函數的概念,然後提出了行爲和現實概念類似的函數,比如用\x -> \y -> x表示True.這些函數的行爲與現實概念的行爲產生了對應(比如用函數定義的自然數集也符合皮亞諾公理),從而可以把一個很大的理論體系建立在lambda演算這個概念上。

數學裏的定義對應CS裏的記號(notation),對於一個記號,只要描述清楚他的性質,就相當於把這個記號定義了出來。lambda演算的目的就是將T,F,與或非,0
1,後繼前驅加法乘法這些記號綁定到一些specially designed的函數上,使得這些記號仍然具有我們所熟悉的特性。

爲什麼非得要強調不帶類型系統的lambda演算?
因爲不帶類型系統會讓lambda演算具有更強大的描述能力。比如Y組合子的類型(如果寫得出來的話)是t -> t1 -> ... -> t1,或者t滿足t = t -> t1,這個類型不是有限的,從而不能在一個類型系統中存在,但是Y組合子可以在不帶類型系統的lambda演算中定義出來。

我(可能)會在近期的博客中給出A Tutorial Introduction to the Lambda Calculus (Raul Rojas)的讀書筆記和習題解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章