好程式設計師大資料分享Scala系列之柯里化

好程式設計師IT發表於2019-10-14

  好程式設計師大資料教程Scala系列之柯里化,柯里化是把接受多個引數的函式變換成接受一個單一引數(最初函式的第一個引數)的函式,

並且返回接受餘下的引數而且返回結果的新函式的技術。

下面先給出一個普通的非柯里化的函式定義,實現一個加法函式:

scala>  def plainOldSum(x:Int,y:Int) = x + y
plainOldSum: (x: Int, y: Int)Int
scala> plainOldSum(1,2)
res0: Int = 3

使用“柯里化”技術,把函式定義為多個引數列表:

scala>  def curriedSum(x:Int)(y:Int) = x + y
curriedSum: (x: Int)(y: Int)Int
scala> curriedSum (1)(2)
res0: Int = 3

當你呼叫 curriedSum (1)(2)時,實際上是依次呼叫兩個普通函式(非柯里化函式),第一次呼叫使用一個引數 x,返回一個函式型別的值,第二次使用引數y呼叫這個函式型別的值,我們使用下面兩個分開的定義在模擬 curriedSum 柯里化函式:

首先定義第一個函式:

scala>  def first(x:Int) = (y:Int) => x + y
first: (x: Int)Int => Int

然後我們使用引數1呼叫這個函式來生成第二個函式。

scala>  val second=first(1)
second: Int => Int = <function1>
scala> second(2)
res1: Int = 3

first,second的定義演示了柯里化函式的呼叫過程,它們本身和 curriedSum 沒有任何關係,但是我們可以使用 curriedSum 來定義 second,如下:

scala>  val >
onePlus: Int => Int = <function1>

下劃線“_” 作為第二引數列表的佔位符, 這個定義的返回值為一個函式,當呼叫時會給呼叫的引數加一。

scala> onePlus(2)
res2: Int = 3

透過柯里化,你還可以定義多個類似 onePlus 的函式,比如 twoPlus

scala>  val twoPlus = curriedSum(2) _
twoPlus: Int => Int = <function1>
scala> twoPlus(2)
res3: Int = 4


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2659917/,如需轉載,請註明出處,否則將追究法律責任。

相關文章