[scala]函數語言程式設計思想入門

橘子oly發表於2016-09-27

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是將來的潮流,所以函數語言程式設計的這個特性非常重要。









相關文章