在這個專欄的【scheme歸納】4 高階函式中已經初步介紹了什麼是高階函式(higher-order procedures)。而在這一節中,將用高階函式來做抽象。書中分了許多小節來逐一介紹這一主題。在「過程作為引數」中,書中用了許許多多的相似示例來概括起乙個抽象的操作。lambda用和define同樣的方式來建立過程,唯一的區別僅僅是不為過程提供引數。這就是函式式程式設計和命令式程式設計的最大區別了,在c++等語言中我們總是會定義許多的變數和常量,而在scheme中一路下來幾乎都是函式。函式與函式之間也不再是用變數等做引數,再用乙個return來返回,它可以用過程來作為引數,甚至過程還可以作為返回值。
在第38頁前後的各種求和中,這些程式幾乎是相同的,沒有太多的區別。它們都具有相同條件,相同的謂詞和相同的結果,並且這些代換方式都是如此相似。如果現在仔細回想,我們至今為止已經學習了哪些語法,哪些組合,哪些抽象,還有沒有學到的常見模式。作者說,計算機應讓人快樂,而不是人讓計算機快樂。所以人們會建立讓自己更容易編寫程式、更易於閱讀的程式語言,因此就引進了一切抽象的東西。
至今為止一直談論的過程,僅僅是在提醒我們關於這個語言的框架,我們用原始的東西來構建乙個系統。這其中用到了一些組合的手段,通過它把原始的東西做成複雜的事物;用抽象技術來利用複雜的事物以及給它們命名,這就像是搭積木一般。還可以用高階函式來實現許多常規的方法。就像是書中第45頁的不動點搜尋和牛頓法。通過組合起這些抽象將獲得無窮的力量。
而這一切的關鍵思想就是去建立乙個分層次的系統。因此舉例來說,當我們在寫乙個求平方根的程式時,程式的某一部分就是用了乙個名為good-enough的函式,而在那之間則存在著抽象。作者舉例說,如果我們和george一起寫乙個求平方根的程式,而george的工作就是寫good-enough。而我們並不用去關心這個函式是如何進行的。甚至即是george在這裡函式裡用了harry寫的抽象過程,我們也不用去關心甚至不用知道有這樣乙個過程或者harry是不是存在。因為good-enough的細節是由george來完成的。在乙個大型系統中,我們許多許多級別的抽象屏障(書中第58頁講解了抽象屏障),而我們要做的就是一遍一遍的去實施程式。
關於資料方面的問題,我們首先要將源資料放在一起組成比較複雜的復合資料,當我們在一組簡單資料之上建立復合資料的時候要用到抽象的方法。其次,還要建立系統的層次。書中有有理數的例子來介紹了這一點。
在lisp上有乙個操作符叫做cons,其有2個引數x和y,然後返回乙個序對pair。所謂的構造就是通過cons操作,在後面的學習中將會發現,無論是構造佇列,甚至是構造流都是通過cons操作。書名中的structure為名詞構造,結構,動詞的構造是construct。
上篇博文在控制複雜性部分用了級聯一次,第79頁就介紹了模組化結構。在真實的訊號處理應用中,設計者通常總是從標準化的過濾器和變化裝置族中選出一些東西,通過級聯的方式構造出各種系統。所謂級聯,就是將2種以上的裝置、訊號等通過某種方式連線到一起。可能我們暫時在實際中還用不到它,但無論如何,資料抽象都是乙個強大的技術。
對於資料抽象計數,我最為驚嘆的便是church計數。也即是練習2.6,通過lambda演變就可以建立出所有的自然數和加減乘除。當然了,我的理解有限,不過我相信加減乘除之外的操作也是可以實現的。這道題也有一篇博文來解答:【sicp練習】47 練習2.6
SICP歸納 2 高階函式和資料抽象
書中展示了非常多有趣的句法 syntax 如今我們要讓思想進一步的抽象。寫這篇部落格的時候並未學完整本書。更不敢說對書中的內容有乙個多深的領悟。但我一路學習過來。就感覺書中的演示樣例越來越抽象,作者所引導我們的也是如此方向。博文也會持續更新下去,伴隨著我的理解。在這個專欄的 scheme歸納 4 高...
React 知識點歸納 純函式和高階函式
一類特別的函式 只要是同樣的輸入,必定得到同樣的輸出 必須遵守以下一些約束 a.不得改寫引數 b.不能呼叫系統 i o 的 api c.能呼叫 date.now 或者 math.random 等不純的方法 reducer 函式必須是乙個純函式 理解 一類特別的函式 a.情況 1 引數是函式 b.情況...
Python 高階函式(2)
sorted 函式也是乙個高階函式,它還可以接收乙個key函式來實現自定義的排序。key指定的函式將作用於list的每乙個元素上,並根據key函式返回的結果進行排序。假設我們用一組tuple表示學生名字和成績 l bob 75 adam 92 bart 66 lisa 88 請用sorted 對上述...