如何理解面向組合子編程?

RT...===LINQ for C++/C# ?


http://www.madore.org/~david/programs/unlambda/

上面這個才是真·面向組合子編程

這貨基於SKI組合子邏輯。。組合子邏輯可以當作比純lambda演算更簡單的一門語言,只通過幾個預定義的組合子的相互apply,就能達到圖靈完備。。比隔壁brainfuck不知高到哪裡去


可以讀一下這本書:Lambda-Calculus and Combinators (豆瓣)

本書對比了lambda演算和combinatory logic,這是兩套簡潔但圖靈完備的形式系統。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

人們經常提到的是lambda演算,很多函數式語言可以建立在這套系統之上,

(另外TAPL也是從untyped lambda演算講起的。。

它引入了變數綁定,更名,函數應用等概念,確實是大多數編程語言的抽象版本。

而combinatory logic提到的人不多,雖然它形式上更簡潔一些,去掉了綁定這一層,

只是幾個組合子互相作用來進行演算。(然後居然還可以與lambda演算圖靈等價。。

可是,邏輯學給我們的啟示是,形式系統越簡單,推導起來越複雜,只是理論上好用而已。

(比如命題演算的自然推理形式系統N,與形式系統P。。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

回過頭來說,如果題主對lambda演算和combinatory logic有疑惑,建議讀幾本數理邏輯的書,

建立起符號語法與語義模型之間的統一認識,(不然很容易陷入這麼多邏輯系統的坑中。。

在邏輯學之上,可以把它們看做滿足不同約束條件的系統,然後結合實際給出相應的語義解釋。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

至於,『面向』XXX編程,我從來不看這個。。

必要時,『面向』的東西會變的,關鍵是知道有,隨機應變。


組合子。

你是說 Combinatory Logic?那個除了做形式邏輯的,沒人用吧……

召喚 @霧雨魔理沙


看ajoo在javaeye上面的《創世紀》,然後就明白了


《Understanding Computation》(中譯名:計算的本質)一書在介紹 SKI 組合子的章節中簡單比較了 lambda 演算和 SKI 組合子。

lambda 演算儘管很簡單了,但依然有三種表達式:變數、函數和調用,而變數導致了歸約過程的複雜。SKI 組合子演算則更簡單,只有兩種表達式:調用以及符號;而且規則也簡單,只有三種函數 S、K 和 I。

書中還介紹了其他組合子,如 ? 組合子(希臘字母 iota)等等。

題主可以看看此書,也許能解答一些你的疑惑。


上面那些答案說的「組合子」是組合子編程模型那個組合子,不是「組合子風格」那個組合子

想學組合子風格編程看bird的書,有兩本,絕對正宗


折騰.


推薦閱讀:

C語言的設計模式有哪些?
面向對象、面向服務、面向組件三種編程模式有什麼區別?分別適用於哪些領域的開發?
Swift code will run on Google's Fuchsia OS

TAG:編程語言 | 面向對象編程 | C | C# | 設計模式 |