Functional Programming 說的就是 Lambda Calculus 嗎?
01-14
看起來lambda calculus基本已經包含了functional programming的特點:也就是把function 當作first class citizen。 然後用作一系列的操作。
不是。純lambda calculus里你要用Church Encoding來把整數、布爾運算表示成lambda表達式,反直覺而且低效率。
最起碼,拿來做真實的函數式語言模型的話,你需要拓展純lambda calculus,添加內建的值和操作符,這個模型叫ISWIM,是動態類型的,去掉賦值之後的「純」Scheme就是這個樣子。
然後繼續拓展就是加類型系統了。
推薦題主看看SPJ的The Implementation of Functional Languages,看看函數式語言的各種複雜特性如何通過一層一層的desugaring最後規約到(稍加拓展的)lambda calculus。建議看David Turner在TFP12上的文章https://www.cs.kent.ac.uk/people/staff/dat/tfp12/tfp12.pdf
,嫌長也有slide http://www-fp.cs.st-andrews.ac.uk/tifp/TFP2012/TFP_2012/Turner.pdf從Lambda Calculus到:
Lambda Calculus (Church 1930s) LISP (McCarthy 1960) Algol 60 (Naur et al. 1963)ISWIM (Peter Landin 1965)PAL (Evans 1968)
SASL (1973–83) FP(J.Backus 1978)Edinburgh系列 (1969–80) — NPL, early ML, HOPE Miranda (D.Turner 1986)Haskell (1992 . . . )
...不是。我大概可以理解題主所要表達的意思,函數式語言的計算模型的確是建立在lambda calculus之上的。但是lambda calculus也僅僅是一個語圖靈模型等價的計算模型而已。
誠然,你可以用lambda calculus的var abs app 三個元素就可以輕易的表達出與其他語言等價的運算。但是對程序語言而言,我們關心的不僅僅是表達出我們想要的計算,更重要的是這個語言是如何去表達的。
所以光有lambda calculus是不夠的,我們不可能在編寫代碼的時候,手寫f.x.x 去表示0,這對程序員來說就像是手寫機器碼一樣的噩夢,所以我們至少要在其中拓展自然數和字元串這樣內建的數值,並且定義內建的操作符。這樣就足夠了嗎?當然遠遠不夠,有了這些內建的值和操作,對於1 + "ab"這樣的運算,在沒有預先定義的情況下,我們無法給出答案,所以我們還得建立一個類型系統。等等等等。推薦閱讀:
※clojure中 x x #x 他們之間的關係一直很暈 能給一些應用場景例子嗎?
※Lisp 解釋器?
※如何寫 Lisp 解釋器?
※一個編程語言能否成功的關鍵之處?
※Lisp可以完成哪些其它語言難以實現的功能?最好能夠舉一些例子
TAG:計算機 | Lisp | CommonLisp | Lambda演算 |