程式語言中的泛函

在數學里,簡單來說泛函就是函數的函數。泛函的自變數是函數,在數學里稱為宗量,而在程式語言swift中稱為閉包‘closure’。

在swift中,宗量寫法與函數類似,但需要將自變數和返回值聲明都放置到花括號對之中,並與剩餘部分用‘in’隔開,如果沒有返回值,也須用空的圓括號佔位。而泛函的定義則與普通函數無異,只是要在變數聲明裡寫出宗量的自變數和返回值。

例如我們定義兩種平均數,調和平均與幾何平均:

import Foundation

let harmonic = { (_ corrected: [Double]) -> Double in
    return Double(corrected.count)/corrected.reduce(0.0,{$0+1.0/$1})
}

let geometric = { (_ corrected: [Double]) -> Double in
    return pow(corrected.reduce(1.0,*),1.0/Double(corrected.count))
}

然後我們寫一個泛函用來計算一組數據去掉基線值後的平均值:

func average(_ nums: [Double], _ baseLine: Double, _ ave: (_ corrected: [Double]) -> Double) -> Double {
    var nums = nums
    
    //減去基線
    for i in 0..<nums.count {
        nums[i] -= baseLine
    }
    
    return ave(nums)
}

注意上面average泛函中宗量ave的写法。

我們現在以幾何平均值為基線計算調和平均:

let nums = [1.0,2.0,3.0,4.0]
let baseLine = average(nums,0.0,geometric)
let result = average(nums,baseLine,harmonic)
print(baseLine,result)

在調用泛函時,宗量的寫法與普通自變數無異。

除了自變數可以是函數外,函數的返回值也可以是函數,這裡就不舉例了。

留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *