1. 什麼是函數式編程?python
函數式編程是阿隆佐思想的在現實世界中的實現, 它將電腦運算視爲數學上的函數計算,而且避免使用程序狀態以及異變物件。 函數式編程的最重要基礎是λ演算。並且λ演算的函數能夠接受函數當做輸入(引數)和輸出(傳出值),函數式編程更加強調程序執行的結果而非執行的過程,倡導利用若干簡單的執行單元讓計算結果不斷漸進,逐層推導複雜的運算,而不是設計一個複雜的執行過程。函數式編程的殺手鐗正是當今世界上日益增加的並行性編程和元數據編程趨勢。其主要思想就是把運算過程儘可能寫成一系列嵌套的函數調用git
2. 函數式編程的特色:程序員
str
就是一類不可變的數據 結構。 你不能在原來的字符串上進行修改,每次想要進行相似的操做,其實都是生成了一個新的
str
對象。 然而 Python 中的鏈表結構則是可變的。
a = "hello ," b = a a += 'world' print a # hello ,world print b # hello ,
swift中更多的是值類型,而不是引用類型,你會發現Int,Float,String,Array,Dictionary等都是Struct類型,而Struct都是值類型【暗示告終構體應該主要 用於封裝數據】,固然Enum也是值類型github
在swift中區分值類型和引用類型是爲了將可變和不可不區分開來。值類型的數據傳遞給函數,函數內部能夠自由拷貝,改變值,而不用擔憂產生反作用。在多線 程環境下,多個線程同時運行,可能會意外錯誤地修改數據,這經常會是一種難以調試的bug。而使用值類型,你能夠安全地在線程間傳遞數據,由於值類型傳遞 是拷貝,因此無需在線程間同步數據變化。這就能夠保證代碼線程環境下的安全性。編程
swift中的參數定義中加入inout,這樣的話就能夠經過參數來修改變量。這個特性頗有C的風格。swift
使用swift自帶的數據結構並不能很好的的實現「無反作用」的「純函數式」編程。幸虧做爲一種關注度很高的語言, 已經有開發者爲其實現了一套徹底知足不可變要 求的數據結構和庫:Swiftz。堅持使用let和swiftz提供的數據結構來操做,就能夠實現「純函數式」編程。數組
不變性有諸多好處安全
更高層次的抽象。程序員能夠以更接近數學的方式思考問題。數據結構
更容易理解的代碼。因爲不存在反作用,不管多少次執行,相同的輸入就意味着相同的輸出。純函數比有可變狀態的函數和對象理解起來要容易簡單得多。你無需再擔憂對象的某個狀態的改變,會對它的某個行爲(函數)產生影響。多線程
線程安全的代碼。這意味着多線程環境下,運行代碼沒有同步問題。它們也不可能由於異常的發生而處於沒法預測的狀態中。
惰性求值
惰性計算是函數式編程語言的一個特性。惰性計算的表達式不在它被綁定到變量以後就當即求值,而是在該值被取用的時候求值。惰性計算有以下優勢。
func doSomeWork(optional:Int?,defaultValue:Int)->Int{ if let opt = optional{ return opt }else{ return defaultValue } } func doSomeWorkNew(optional:Int?, defaultValue:()->Int)->Int{ if let opt = optional{ return opt }else{ return defaultValue() } } let value:Int? = 1 doSomeWork(value, (2+5)) doSomeWorkNew(value, { () -> Int in return 2+5 })
上面的代碼能夠感受到惰性求值的好處。
swift也提供了支持惰性求值的語法:下面展現了將默認是嚴格求值的數組變爲惰性序列:
let r = 1...3 let seq = lazy(r).map { (i: Int) -> Int in println("mapping \(i)") return i * 2 } for i in seq { println(i) }
Swift對函數式編程的支持,使得程序員多了一種選擇。Swift並不強迫程序員必定要以面向對象的方法思惟。在場景合適的狀況下,程序員能夠選擇使用函數式風格編寫代碼。若是確實是合適的場景,就可以改善生產力。現實的選擇是支持面向對象編程的同時,提供函數式的支持。這樣,在大部分面向對象遊刃有餘的地方,仍然可使用面向對象的方法。而在適合函數式編程的地方,而你又擁有函數式編程的思惟和能力時,還能夠採用函數式的編程方法改善生產力。
接下來的系列文章中我將以《Functional Programing in Swift》這本書,來一塊兒學習swift的函數式編程。