[scala]函數語言程式設計思想入門
1.python閉包的栗子
def make_adder(addend):
def adder(augend):
return augend + addend
return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)
這裡比較特殊的就是make_adder是一個函式,而該函式由定義了一個新的函式,並且在新的函式內使用了外層函式中的引數addend。
關於閉包,專業的名詞解釋是:閉包(CLosure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變數的函式。
實際上,閉包是起函式作用,並能相操作物件一樣操作的物件。
2.函數語言程式設計思想
定義:簡單說,“函數語言程式設計”是一種程式設計正規化,也就是如何編寫程式的方法論。它屬於“結構化程式設計”的一種,主要思想是把運算過程儘量寫成一系列巢狀的函式呼叫。
函數語言程式設計的主要幾個思想:
1)函式是“第一等公民”
所謂“第一等公民”,指的是函式與其他資料型別一樣,處於平等地位,可以賦值給其他變數,也可以作為引數,傳入另一個函式,或者作為別的函式的返回值。
舉慄如下:
var print = function(i){ console.log(i);}; //定義一個函式
[1,2,3].forEach(print); //將函式作為變數
2)只用“表示式”,不用“語句”
表示式是一個單純的運算過程,總是有返回值;而語句是執行某種操作,沒有返回值。函數語言程式設計要求,只使用表示式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。原因是函式是程式設計的開發動機,一是為了處理運算,不考慮系統的讀寫(I/O)。
3)沒有“副作用”
所謂"副作用"(side effect),指的是函式內部與外部互動(最典型的情況,就是修改全域性變數的值),產生運算以外的其他結果。函數語言程式設計強調沒有"副作用",意味著函式要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變數的值。
3.函數語言程式設計的好處
1)程式碼簡潔,開發迅速:函數語言程式設計大量使用函式,減少了程式碼的重複,因此程式比較短,開發速度較快。
2)接近自然語言,易於理解:栗子-----表示式(1 + 2) * 3 - 4,可以寫成函式式語言:subtract(multiply(add(1,2), 3), 4)
3)更方便的程式碼管理:函數語言程式設計不依賴、也不會改變外界的狀態,只要給定輸入引數,返回的結果必定相同。因此,每一個函式都可以被看做獨立單元,很有利於進行單元測試(unit testing)和除錯(debugging),以及模組化組合。
4)易於“併發程式設計”:函數語言程式設計不需要考慮"死鎖"(deadlock),因為它不修改變數,所以根本不存在"鎖"執行緒的問題。不必擔心一個執行緒的資料,被另一個執行緒修改,所以可以很放心地把工作分攤到多個執行緒,部署"併發程式設計"(concurrency)。
栗子:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
由於s1和s2互不干擾,不會修改變數,誰先執行是無所謂的,所以可以放心地增加執行緒,把它們分配在兩個執行緒上完成。其他型別的語言就做不到這一點,因為s1可能會修改系統狀態,而s2可能會用到這些狀態,所以必須保證s2在s1之後執行,自然也就不能部署到其他執行緒上了。多核CPU是將來的潮流,所以函數語言程式設計的這個特性非常重要。
相關文章
- Scala 函數語言程式設計(一) 什麼是函數語言程式設計?函數程式設計
- Scala函式與函數語言程式設計函式函數程式設計
- 函數語言程式設計入門函數程式設計
- 函式式思維和函數語言程式設計函式函數程式設計
- 函數語言程式設計入門教程函數程式設計
- 函數語言程式設計函數程式設計
- 程式設計正規化 —— 函數語言程式設計入門程式設計函數
- Cats(一):從函數語言程式設計思維談起函數程式設計
- 函數語言程式設計入門實踐(一)函數程式設計
- JavaScript函數語言程式設計入門經典JavaScript函數程式設計
- JavaScript函數語言程式設計無痛入門JavaScript函數程式設計
- Python函數語言程式設計入門教程Python函數程式設計
- 函數語言程式設計,真香函數程式設計
- Java 函數語言程式設計Java函數程式設計
- javascript函數語言程式設計JavaScript函數程式設計
- 初探函數語言程式設計函數程式設計
- 函數語言程式設計初探函數程式設計
- JavaScript 函數語言程式設計JavaScript函數程式設計
- 函數語言程式設計雜談函數程式設計
- 初見函數語言程式設計函數程式設計
- RAC的函數語言程式設計函數程式設計
- JavaScript 函數語言程式設計(二)JavaScript函數程式設計
- 函數語言程式設計前菜函數程式設計
- JavaScript 函數語言程式設計(一)JavaScript函數程式設計
- JavaScript 函數語言程式設計(三)JavaScript函數程式設計
- python函數語言程式設計Python函數程式設計
- JavaScript函數語言程式設計(二)JavaScript函數程式設計
- JavaScript函數語言程式設計(一)JavaScript函數程式設計
- JavaScript函數語言程式設計(三)JavaScript函數程式設計
- 函數語言程式設計初探一函數程式設計
- iOS 與 函數語言程式設計iOS函數程式設計
- 函數語言程式設計簡介函數程式設計
- C#函數語言程式設計C#函數程式設計
- Swift の 函數語言程式設計Swift函數程式設計
- 函數語言程式設計入門實踐 —— Compose/Pipe函數程式設計
- .NET併發程式設計-函數語言程式設計程式設計函數
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- 使用java模擬scala函數語言程式設計將函式作為引數傳入方法中Java函數程式設計函式