Scala之柯里化函數

  • 定義

        柯里化(Currying)指的是將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數返回一個以原有第二個參數爲參數的函數。也就是說,有多個參數列表的函數就是柯里化函數,所謂的參數列表就是使用小括號括起來的函數參數列表。

        curry化最大的意義在於把多個參數的function等價轉化成多個單參數function的級聯,這樣所有的函數就都統一了,方便做lambda演算。 在scala裏,curry化對類型推演也有幫助,scala的類型推演是局部的,在同一個參數列表中後面的參數不能借助前面的參數類型進行推演,curry化以後,放在兩個參數列表裏,後面一個參數列表裏的參數可以藉助前面一個參數列表裏的參數類型進行推演。

  • 函數
val add_f = (x: Int, y: Int) => x + y
  • 方法
def add(x:Int, y: Int) = x + y

def add_f = (x: Int, y: Int) => x + y  //轉爲方法
  • 區別
    •  方法只能用def接收,函數可以用def接收,也可以用val接收。
    •  當函數用def來接收之後,不再顯示爲function,轉換爲方法。
    •  方法可以省略參數,函數不可以。函數可以作爲方法的參數.
  • 柯里化實例
def add(x:Int,y:Int)=x+y

     現在我們把這個函數變一下形式:

def add(x:Int)(y:Int) = x + y
  •  代碼
object CurryingInstance {
  def strAdd(st1: String)(st2: String): String = {
    st1 + st2
  }
}


object CurryingTest {
  def main(args: Array[String]): Unit = {
    val str1: String = "Hello, "
    val str2: String = "Scala!"
    val result = CurryingInstance.strAdd(str1)(str2)
    println(result)
  }
}
  • 柯里化函數和偏函數的區別

        下面代碼定義一個普通方法multiply1和一個currying方法multiply2,並將其轉換相應的函數類型:

def multiply1(x: Int, y:Int, z:Int) = x * y * z
val partialAppliedMultiply = multiply1 _
//類型:(x: Int, y: Int, z: Int) => Int

def multiply2(x: Int)(y: Int)(z: Int) = x * y * z
val curryingMultiply = multiply2 _
//類型:Int => (Int => (Int => Int))

      在調用時,curryingMultiply可以依次傳入各個參數,而partialAppliedMultiply在傳入部分參數時,必須顯示指定剩餘參數的佔位符:

val curryingMultiply1 = curryingMultiply(1)
//類型:Int => (Int => Int)

val partialAppliedMultiply1 = partialAppliedMultiply(1, _:Int, _: Int)
//類型:(Int, Int) => Int

另外,curryingMultiply1的類型仍然是currying類型,而partialAppliedMultiply1的類型仍然是普通函數類型。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章