Scala 閉包

2022-05-13 15:16 更新

閉包是一個函數(shù),它的返回值取決于在該函數(shù)之外聲明的一個或多個變量的值。

例子

讓我們創(chuàng)建一個乘法器函數(shù)如圖所示:

var y = 3
val multiplier = (x:Int) => x * y

現(xiàn)在,y具有對函數(shù)外部的變量的引用,但是在包圍范圍中。

object Main extends App { 
    var y = 3
    val multiplier = (x:Int) => x * y
    println(multiplier(3))
} 

部分應(yīng)用功能

在函數(shù)式編程語言中,調(diào)用帶有參數(shù)的函數(shù)是將函數(shù)應(yīng)用于參數(shù)。

當(dāng)所有參數(shù)都傳遞給函數(shù)時,我們將函數(shù)完全應(yīng)用于所有參數(shù)。

一個簡單的添加函數(shù):

val add = (x: Int, y: Int) => x + y
add(1,2)

但是當(dāng)我們只給函數(shù)一個子集的參數(shù),表達(dá)式的結(jié)果是一個部分應(yīng)用的函數(shù)。

val partiallyAdd = add(1, _:Int)

因為我們沒有為第二個參數(shù)提供值,所以變量部分Add是一個部分應(yīng)用的函數(shù)。

當(dāng)給予 partiallyAdd 一個Int值2時,你得到傳遞到add和partiallyAdd函數(shù)的Int數(shù)的總和:

partiallyAdd(2)

當(dāng)我們提供所有參數(shù)時,執(zhí)行原始函數(shù),產(chǎn)生結(jié)果。

Curried函數(shù)

Currying轉(zhuǎn)換具有多個參數(shù)的函數(shù),創(chuàng)建一個函數(shù)鏈,每個函數(shù)都需要一個參數(shù)。

下面的代碼創(chuàng)建了添加兩個Int參數(shù)a和b的add函數(shù),如下所示:

val add = (x: Int, y: Int) => x + y
add(3,3)

在Scala中,curried函數(shù)使用多個參數(shù)列表定義,如下所示:

def add(x: Int)(y: Int) = x + y

我們還可以使用以下語法定義curried函數(shù):

def add(x: Int) = (y: Int) => x + y

而不是兩個Int參數(shù)的一個列表,您應(yīng)用curry add函數(shù)到一個Int參數(shù)的兩個列表。

因此curry add函數(shù)看起來像這樣:

def curriedAdd(a: Int)(b: Int) = a + b
curriedAdd(2)(2)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號