This page looks best with JavaScript enabled

Functional programming serious - The Elements of Programming in SICP

 ·  ☕ 3 min read  ·  ✍️ Mark

重點摘要

本篇取自SICP-1a,解釋最基礎的computer science

What is computer science

  • Process: 如何編寫解決問題的 “過程”
  • Method: 組成process的元素,而method的名稱應該要陳述出裡面的知識

Computer science 的特性

  • 處理" 理想化的元件": 因為我們對所有要組合在一起的 data 與 function都能完全的掌控, 因此在理想與現實之間是差不多的 (如果是電子或機械工程師 那可能會需要考慮很多真實世界的限制)。
  • 一個工程中的 “抽象形式”: 因為不需考慮現實的限制

Computer science 的技術 - 控制複雜度

  • black-box abstraction: 將功能封裝起來,使用的人不需要知道裡面的技術,只要呼叫它,丟入值就會輸出結果,而使用者又可以拿這個功能再去組合成更多功能。
    • 將細節隱藏 (用以構建更大型的盒子)
    • 具有通用性 (generality)
  • Conventional interface: 如果系統裡的數據有許多不一樣的類型,計算的時候總不能混雜在一起,那怎麼辦呢?
    • Generic operations
    • large-scale structure and modularity
    • object-oriented programming
    • operations on aggregate (流)
  • Metalinguistic Abstraction: 定義一個新語言 (用lisp做一個解析器來解析lisp)
    本篇不討論第二項與第三項,純粹討論最基礎的第一項。

用一個例子解釋何謂black-box abstraction

Square root algorithm - 將數字開根號(x^0.5)

計算過程:

  • Make a guess G (猜一個值 G)
  • Improve the guess by average G and x/G (對於 G + x/G 的平均值做優化)
  • Keep improving the guess until it is good enough (持續優化到足夠正確)

由上述的process,可以看出一個 “通則” (猜值 -> 優化 -> 持續優化到正確),

“找尋函數不動點” 的 定理為 F(函數)有一不動點值滿足 F(Y) = Y,

而開根號的計算流程 ,可以視為 “找尋函數不動點” 這個通則 的其中一種方法: 找尋 Y與 x/Y的平均值函數的不動點。 (ex: F= (Y + x/Y)/2, 可以用 x = 36, Y = 6 來試試)

computer science 就是透過設計各式各樣的元件來解決問題,SICP提供了撰寫元件時可依循的想法

  1. 解決問題的時候,將流程寫出來。

  2. 想想是否解決這個單一問題,是一個通用問題的其中一個應用 (產生自 通用函數 )

看上述的問題,本來以為開根號函數非常的複雜,但抽出通用函數之後,我們把複雜度切成 Y, x/Y兩個參數的平均值 與“找尋函數不動點”的通用函數 這兩件事情,複雜度就被限縮在怎麼實作 “找尋函數不動點"這件事情上,這樣持續的做下去,複雜度是不是就層層的減低了呢?

總結

black-box abstraction可由開根號函數看出,使用此函數其實不必知道開根號函數裡面的實作細節,反正調用它,就能達到需求,這是上述提到的第一個關鍵。 而第二個關鍵找到通用性是為了降低複雜度。

當然這只是第一堂課,但也是最核心的觀念,後面會持續使用這個觀念來解決更多問題。


Mark Weng
WRITTEN BY
Mark
Electric Machine designer and web developer, use #tags to find more


What's on this Page