控制抽象之柯里化(currying)

前面說過scala容許你建立新的「感受像是原生語言支持」的控制抽象。儘管到目前你已經看到的例子都的確是控制抽象,不過沒有人會誤覺得他們是原生語言支持的。爲了搞明白如何讓控制抽象感受更像語言的擴展,你首先須要明白稱爲柯里化的函數式編程技巧編程

下例展現了一個未被柯里化的函數,它實現對兩個Int型參數x和y作加法函數式編程

def plainOldSum(x:Int,y:Int) = x + y

下面的示例展現了柯里化後的同一個函數:函數

def curriedSum(x:Int)(y:Int) = x + y

柯里化的函數被應用於多個參數列表,而不單單一個,上面這個例子把函數應用於兩個列表。看看下面的調用執行結果:spa

因此,這裏咱們能夠看到,函數的柯里化就是把帶一個參數列表的函數轉換成帶多個參數列表的函數。理論上說,柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數。scala

咱們接着看上面這個柯里化函數的例子,這裏發生的事情是當你調用curriedSum時,實際上接連調用了兩個傳統函數第一個函數調用帶單個的名爲x的Int參數,並返回第二個函數的函數值。第二個函數帶Int參數y。下面的名爲first的函數實質上執行了curriedSum的第一個傳統函數調用會作的事情:code


在第一個函數上應用1,會產生第二個函數:class

在第二個函數上應用2產生結果:擴展


這裏first與second函數只是柯里化過程的一個演示。他們並不直接鏈接在curriedSum函數上。儘管如此,仍然有一個方式得到實際指向curriedSum的「第二個」函數的參考。你能夠用偏應用函數表達式,把佔位符注用在curriedSum裏,如:技巧


curriedSum(1)_裏的下劃線第二個參數列表的佔位符(注:當佔位符標註用在傳統方法上時,如println_,你必須在名稱和下劃線之間留一個空格。在這個例子裏不須要,由於println_是scala裏合法的標識符,curriedSum(1)_不是)。結果就是指向一個函數的參考,這個函數在被調用的時候,對它惟一的Int參數加1並返回結果。方法

相關文章
相關標籤/搜索