W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
閉包是一個(gè)函數(shù),它的返回值取決于在該函數(shù)之外聲明的一個(gè)或多個(gè)變量的值。
讓我們創(chuàng)建一個(gè)乘法器函數(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)) }
在函數(shù)式編程語言中,調(diào)用帶有參數(shù)的函數(shù)是將函數(shù)應(yīng)用于參數(shù)。
當(dāng)所有參數(shù)都傳遞給函數(shù)時(shí),我們將函數(shù)完全應(yīng)用于所有參數(shù)。
一個(gè)簡單的添加函數(shù):
val add = (x: Int, y: Int) => x + y add(1,2)
但是當(dāng)我們只給函數(shù)一個(gè)子集的參數(shù),表達(dá)式的結(jié)果是一個(gè)部分應(yīng)用的函數(shù)。
val partiallyAdd = add(1, _:Int)
因?yàn)槲覀儧]有為第二個(gè)參數(shù)提供值,所以變量部分Add是一個(gè)部分應(yīng)用的函數(shù)。
當(dāng)給予 partiallyAdd
一個(gè)Int值2時(shí),你得到傳遞到add和partiallyAdd函數(shù)的Int數(shù)的總和:
partiallyAdd(2)
當(dāng)我們提供所有參數(shù)時(shí),執(zhí)行原始函數(shù),產(chǎn)生結(jié)果。
Currying轉(zhuǎn)換具有多個(gè)參數(shù)的函數(shù),創(chuàng)建一個(gè)函數(shù)鏈,每個(gè)函數(shù)都需要一個(gè)參數(shù)。
下面的代碼創(chuàng)建了添加兩個(gè)Int參數(shù)a和b的add
函數(shù),如下所示:
val add = (x: Int, y: Int) => x + y add(3,3)
在Scala中,curried函數(shù)使用多個(gè)參數(shù)列表定義,如下所示:
def add(x: Int)(y: Int) = x + y
我們還可以使用以下語法定義curried函數(shù):
def add(x: Int) = (y: Int) => x + y
而不是兩個(gè)Int參數(shù)的一個(gè)列表,您應(yīng)用curry add函數(shù)到一個(gè)Int參數(shù)的兩個(gè)列表。
因此curry add函數(shù)看起來像這樣:
def curriedAdd(a: Int)(b: Int) = a + b curriedAdd(2)(2)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: