Scala函數(shù)式編程基礎二

Scala函數(shù)式編程基礎

閉包

當一個函數(shù)的執(zhí)行依賴于聲明在函數(shù)外部的一個或者多個變量時,則稱這個函數(shù)為閉包,因為它包含了調(diào)用此函數(shù)的語句所在的上下文環(huán)境,函數(shù)改變了外部變量的生命周期。很多人以為寫一個閉包函數(shù)首先要有一個函數(shù)嵌套,然后內(nèi)部函數(shù)引用外部函數(shù)的變量,然后返回的是一個函數(shù),大概是這樣:

object closure {
  def main(args: Array[String]): Unit = {
    println(makeAdd()(1))
  }
  def makeAdd() = {
    val more = 10
    (x: Int) => x + more
  }
}

其實這里的外部函數(shù)主要是為了隱藏變量,限制變量的作用范圍,并不是必須的;把外部變量more改為makeAdd的參數(shù)時:

object closure {
  def main(args: Array[String]): Unit = {
    println(makeAdd(12)(13))
  }
def makeAdd(more : Int) = (x: Int) => x + more
}

這實際上就是柯里化函數(shù)的樣式了。閉包實際上不是必須要嵌套函數(shù)的,比如:

var more = 10
val addMore = (x:Int)=> x+ more

偏函數(shù)

有時候一個函數(shù)在特殊的應用場景下,部分參數(shù)可能始終取相同的值,為了避免每次都提供這些相同的參數(shù)值,可以該函數(shù)來定義一個新的函數(shù),這就是偏應用函數(shù)。例如:

def sum(a:Int,b:Int,c:Int) = a+ b+ c
val a = sum(1,_:Int,_:Int) 
a(2,3)   //相當于sum(1,2,3)
val b = sum _   //進行ETA展開,方法轉(zhuǎn)換為一個函數(shù)注意sum后有空格
b(1,2,3)   //相當于sum(1,2,3)

Curry化

Curry化函數(shù)是指那種帶有多個參數(shù)列表且每個參數(shù)列表只包含一個參數(shù)的函數(shù);例如:

//方法可以有多個參數(shù)列表
def multiplier(factor:Int)(x:Int) = x * factor
val byTwo = multiplier(2)_   //第一個參數(shù)固定為2,保留mutilplier第二個參數(shù)的偏應用函數(shù)
byTwo(5)    //相當于mutiplier(2,5)

實際上,可以通過Curry化過程,將一個多參數(shù)的普通函數(shù)轉(zhuǎn)化為Curry化函數(shù),例如:

def plainMultiplier(x:Int,y:Int) = x * y   //帶有兩個參數(shù)的普通函數(shù)
val curriedMutiplier = (plainMutiplier _).curried    //先將方法進行ETA展開,然后進行Curry化
//curriedMultiplier:Int => (Int => Int)=<function>
curriedMultiplier(2)(3)  //結(jié)果和curriedMultiplier(2,3)相同

由curriedMultiplier的結(jié)構(gòu)可以看出,普通函數(shù)和Curry化函數(shù)的區(qū)別在于普通函數(shù)將參數(shù)傳入后函數(shù)是一次運行并得到結(jié)果,而Curry函數(shù)是惰性求值,先傳入第一個參數(shù)作用于函數(shù),此時還未真正求值,然后傳入第二個參數(shù)作用于內(nèi)部的函數(shù),在內(nèi)部函數(shù)中進行求值,最終返回結(jié)果。這就是前面的閉包,第一個參數(shù)相當于外部局部變量,第二個參數(shù)所在的內(nèi)部函數(shù)依賴于它(Curry化函數(shù)被scala轉(zhuǎn)化為了閉包的)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容