Swift-函數式編程

函數式編程是一種編程範式,一個方法論。
其主要思想: 把計算過程儘量分解成一系列可複用函數的調用。
主要特徵: 函數是“第一等公民”,也就是函數與其他數據類型一樣,可以賦值給其他變量,作爲函數參數或者返回值。

1. 柯里化(currying)

高階函數:接收一個或多個函數作爲輸入;或者返回一個函數。
柯里化:將一個接收多個參數的函數變換爲一系列只接收單個參數的函數的過程。
柯里化例子:將傳3個參數的函數變爲連續傳參的函數

func add_tobeCurrying(v1: Int, v2: Int, v3: Int) -> Int { v1 + v2 + v3 }

// 將帶三個參數的函數進行柯里化
prefix func ~<A, B, C, D>(_ fn: @escaping (A, B, C) -> D) -> (C) -> (B) -> (A) -> D {
    {c in { b in { a in fn(a, b, c) } } }
}

func testCurrying() {
    print((~add_tobeCurrying)(10)(20)(30))
}
2. 函子(Factor)

像Array、Optional這樣支持map運算的類型,稱爲函子。

3. 適用函子(Applicative Functor)

對於任意一個函子F,如果能支持以下運算,那麼該函子就是適用函子。

func pure<T>(_ value: T) -> F<T>
func <*><A, B>(fn: F<(A) -> B>, value: F<A>) ->F<B>

Array、Optional是適用函子:

// T是一個函子類型
func pure<T>(_ value: T) -> T? {
    return T
}
infix operator <*> : AdditionPrecedence
func <*><A, B>(fn: ((A) -> B)?, value: A?) -> B? {
    guard let f = fn, let v = value else{
        return nil
    }
    return f(v)
}

var number: Int? = 10
var fn: ((Int) -> Int)? = { $0 * 5 }
pure(number)// 這裏是Optional(10)
fn <*> number// 這裏在<*>中綴運算符計算後,得到的結果是Optional(50)
4. 單子(Monad)

對於任意一個類型F,如果支持以下操作就被稱爲單子。

func pure<T>(_ value: T) -> F<T>
func flatMap<A, B>(_ value: F<A>, _ fn: (A) -> F<B>) -> F<B>

可選類型、數組顯然符合這兩個條件。

數組、Optional也是符合的,可見Swift語言爲函數式編程是做了支持的,而在OC中,函數式編程集成了ReactiveObjc庫之後纔有這些高階函數,纔算是支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章