Scala 函數柯里化(Currying)
Scala 函數柯里化(Currying)
柯里化(Currying)指的是將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數返回一個以原有第二個參數為參數的函數。
范例
首先我們定義一個函數:
def add(x:Int,y:Int)=x+y
那么我們應用的時候,應該是這樣用:add(1,2)
現在我們把這個函數變一下形:
def add(x:Int)(y:Int) = x + y
那么我們應用的時候,應該是這樣用:add(1)(2),最后結果都一樣是3,這種方式(過程)就叫柯里化。
實現過程
add(1)(2) 實際上是依次調用兩個普通函數(非柯里化函數),第一次調用使用一個參數 x,返回一個函數類型的值,第二次使用參數y調用這個函數類型的值。
實質上最先演變成這樣一個方法:
def add(x:Int)=(y:Int)=>x+y
那么這個函數是什么意思呢? 接收一個x為參數,返回一個匿名函數,該匿名函數的定義是:接收一個Int型參數y,函數體為x+y。現在我們來對這個方法進行調用。
val result = add(1)
返回一個result,那result的值應該是一個匿名函數:(y:Int)=>1+y
所以為了得到結果,我們繼續調用result。
val sum = result(2)
最后打印出來的結果就是3。
完整范例
下面是一個完整范例:
object Test { def main(args: Array[String]) { val str1:String = "Hello, " val str2:String = "Scala!" println( "str1 + str2 = " + strcat(str1)(str2) ) } def strcat(s1: String)(s2: String) = { s1 + s2 } }
執行以上代碼,輸出結果為:
$ scalac Test.scala $ scala Test str1 + str2 = Hello, Scala!