如何理解面向組合子編程?
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