這是我在Coursera上Scala Specialization的筆記,與同好共享。
目前存在至少三種programming paradigms (paradigms可以說是觀點或是思考模式)。
1. logic programming: 包含prolog之類的語言。
2. imperative programming: 主流的c, c++, java等。特色就是mutable variables, 以及其衍生而來的loopable control structures (e.g. for loop)。
3. functional programming: erlang, scala等。
Imperative paradigm主要是Von Neumann machine架構下的運算邏輯,例如以下的對應:
上面的邏輯會發展出word by word大小的資料結構,如果想要scale up來處理更大的複雜問題,自然而然地就要往高階抽象單元發展,例如collections, strings, polynomials,...。
高階抽象單元若是依賴數學性質去建立的話,就會產生一個imperative programming設計上達不到的矛盾: immutability。數學中並不存在某個operator, 使得一個物件在改變某些屬性後仍能被稱做同一物件的邏輯,例如某個多項式ax+b=c,如果改變了a係數為a+1,我們不會說這改變後的多項式仍是未改變前的同一實體(雖然只是係數改變)。但是一個模擬多項式的Java class的確是可以改變其data member (例如某個叫做a的float),而在記憶體中仍然是同一個instance。
以上的行為將會破壞數學理論及其衍生出來定律的可靠性,所以不適合拿來當作依照數學理論來建立的高階抽象單元。
所以按照數學理論設計的functional paradigm, 其中一個主要特點就是data is immutable! 這一點是和imperative paradigm最不同之處。functional programming顧名思義就是要focus在function設計上,此處的function是指數學上的函數,也就是思考如何把某個input map到某個output,此input甚至可以是另一個函數,所以在程式語言設計上,function也是一個value,可以被當作參數傳遞於任何function中,這樣的在imperative language沒有的"特權",可以稱做first-class citizens。
某個value其實就是某個function mapping出來的結果,只要有input就會有output,所以把function看作value來任意傳遞與宣告,在functional programming的邏輯架構中不會奇怪。
另外,上了今天的課我才知道,原來我很久以前就寫過functional programming language啊!!!
那就是smalltalk,雖然我已經忘了是怎麼一回事了....
(目前在coursera/edx 玩過的包括 SML, OCaml, Scala. 自學的有Scheme)。
沒有留言:
張貼留言