Scala中的柯里化

2021-09-07 19:45:29 字數 1863 閱讀 5838

柯里化(currying)技術 christopher strachey 以邏輯學家 haskell curry 命名的(儘管它是 moses schnfinkel 和 gottlob frege 發明的)。它是

把接受多個引數的函式變換成接受乙個單一引數(最初函式的第乙個引數)的函式,並且返回接受餘下的引數且返回結果的新函式的技術。

還是老觀點——無論是修煉新技術還是舊理論,結合小案例理解學習,才是最有效的方法。下面將通過幾個例子來學習scala柯里化。

2.1、從2個整數相乘運算的函式來揭開柯里化的神秘面紗

在scala中定義2個整數相乘運算的函式是非常簡單的,具體如下:

def multiplie2par(x:int,y:int)=x*y

使用柯里化技術可以將上述2個整數的乘法函式改修為接受乙個引數的函式,只是該函式返回是乙個以原有第二個引數為引數的函式。

def multiplie1par(x:int)=(y:int)=>x*y

【ps說明:multiplie1par(x:int)為接收乙個引數的新等價函式,(y:int)=>x*y則是新等價函式的返回體,它本身就是乙個函式(嚴格來說應該是乙個匿名函式),引數為除等價新函式的引數外原函式剩餘的引數。】

上述使用柯里化技術得到等價新函式,在scala語言中看起來還不是很簡潔,在scala中可以進一步簡化為:

def multiplie1par1(x:int)(y:int)=x*y

編譯執行的結果如下:

同樣對於三個整數乘法的函式在scala中由於有柯里化的存在,自然有多種功能等價的函式定義形式,如以下四種函式都是實現了三個整數乘法功能,只不過呼叫不同形式引數過程略有不同,直接參入三個引數的一步到位就可以得到運算結果,而傳入1或者2個引數的需要分步驟再傳入第2/3或者第3個引數才能求出三個整數相乘的結果,很好地體現了延遲執行或者固定易變因素等方面能力。

def multiplie3par(x:int,y:int,z:int)=x*y*z

def multiplie3par1(x:int)=(y:int,z:int)=>x*y*z

def multiplie3par2(x:int)(y:int)(z:int)=x*y*z

def multiplie3par3(x:int)(y:int)=(z:int)=>x*y*z

編譯執行的結果都是一樣

2.2、scala中柯里化的另一種典型案例——correspondsf方法的柯里化應用

在scala中corresponds方法能使得兩個序列按照一定的條件進行比較,該方法其實也是經過柯里化引數的。在scala的api中該方法定義如下:在方法簽名描述中有兩個引數,that序列和p函式,其中p函式有兩個引數,第二個引數型別是與that序列一致的。應用柯里化,我們可以省去第二個引數中b的型別,因為從that序列中推斷出b的型別。

def corresponds[b](that: genseq[b])(p: (t, b) ⇒ boolean): boolean

因此假如有字串型別序列a和字串序列b,我們可以使用a. corresponds(b)(_. equalsignorecase(_))來判斷兩個字串序列在不區分大小的情況是否一致,這就為程式設計帶來了「魔法般」的靈活性。   

3.1、柯里化技術在提高適用性還是在延遲執行或者固定易變因素等方面有著重要重要的作用,加上scala語言本身就是推崇簡潔編碼,使得同樣功能的函式在定義與轉換的時候會更加靈活多樣。另外在spark的原始碼中有大量運用scala柯里化技術的情況,需要掌握好該技術才能看得懂相關的源**。

3.2、在scala柯里化中,閉包也發揮著重要的作用。所謂的閉包就是變數出了函式的定義域外在其他**塊還能其作用,這樣的情況稱之為閉包。就上述討論的案例而言,如果沒有閉包作用,那麼轉換後函式其實返回的匿名函式是無法在與第乙個引數x相關結合的,自然也就無法保證其所實現的功能是跟原來一致的。

scala中的柯里化

先看看百科當中的關於柯里化的介紹 在電腦科學中,柯里化 英語 currying 又譯為卡瑞化或加里化,是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。在直覺上,柯里化聲稱 如果你固定某些引數,你將得到接受餘下引數的乙個函式...

Scala柯里化和反柯里化

名詞解釋 在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。柯里化舉例說明 def curry1 a,b,c a a,f a,b c b c b b f a,b 這個函式的結果是乙個高階...

Scala學習筆記 Scala中的柯里化

柯里化的意義 一 提高程式效能,而是使 模組化,減少耦合增強其可維護性。二 函式的通用性有所降低,但是適用性有所提高。沒使用語法糖的 sum 函式 def sum f int int int,int int 使用語法糖後的 sum 函式 def sum f int int a int,b int i...