code

2016年10月22日 星期六

Scala 筆記 6 - Higher order functions / Anonymous functions

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) )


沒有留言:

張貼留言