Higher order functions
Higher order functions簡單來說就是能接受function當作參數傳入,或是能回傳function的functions。沒有這種能力的function則稱為first order function(低層次就對了)。為何要有higher order function的設計? 主要還是程式模組化的考量,以下面數學式為例,summation部分的邏輯是共用的,不同的是f函式的內涵:
使用了higher order function的建構,summation的邏輯就可以完全與f分開,當然f的input/output type必須被summation規範,相當於f要follow某固定signature,如果對一般imperative language來說的話,interface可以來模擬higher order function這部分的好處。
見下圖:
所以我們可以任意替換f來建立不同summation:
id, cube, fact各為符合 Int => Int signature的function。
Anonymous functions (function literals)
anonymous function(或稱為function literals)單純只是為了方便出現的語法,他簡化被當作參數傳入的function的宣告語法,如果這個function的body做了很少的是(例如只是把參數+1),此時不用再進行獨立的宣告,增進可讀性,簡化程式碼。例如上段中各種sumXXX可以改寫成以下:
以上未標明各參數的types,因為compiler會infer。
比較明確的function literals寫法還是把各個參數的type標示出來:
一個簡單的使用範例:
def sum(f: Int => Int, a: Int, b: Int): Int = { def loop(a: Int, acc: Int): Int = { if (a > b) acc else loop(a+1, f(a)+acc) } loop(a, 0) } print( sum( x=>x, 1, 10) )
沒有留言:
張貼留言