W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前面我們說(shuō)過(guò),Scala 允許程序員自己新創(chuàng)建一些控制結(jié)構(gòu),并且可以使得這些控制結(jié)構(gòu)在語(yǔ)法看起來(lái)和 Scala 內(nèi)置的控制結(jié)構(gòu)一樣,在 Scala 中需要借助于柯里化(Currying),柯里化是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。
下面先給出一個(gè)普通的非柯里化的函數(shù)定義,實(shí)現(xiàn)一個(gè)加法函數(shù):
scala> def plainOldSum(x:Int,y:Int) = x + y
plainOldSum: (x: Int, y: Int)Int
scala> plainOldSum(1,2)
res0: Int = 3
下面在使用“柯里化”技術(shù)來(lái)定義這個(gè)加法函數(shù),原來(lái)函數(shù)使用一個(gè)參數(shù)列表,“柯里化”把函數(shù)定義為多個(gè)參數(shù)列表:
scala> def curriedSum(x:Int)(y:Int) = x + y
curriedSum: (x: Int)(y: Int)Int
scala> curriedSum (1)(2)
res0: Int = 3
當(dāng)你調(diào)用 curriedSum (1)(2)時(shí),實(shí)際上是依次調(diào)用兩個(gè)普通函數(shù)(非柯里化函數(shù)),第一次調(diào)用使用一個(gè)參數(shù) x,返回一個(gè)函數(shù)類型的值,第二次使用參數(shù)y調(diào)用這個(gè)函數(shù)類型的值,我們使用下面兩個(gè)分開(kāi)的定義在模擬 curriedSum 柯里化函數(shù):
首先定義第一個(gè)函數(shù):
scala> def first(x:Int) = (y:Int) => x + y
first: (x: Int)Int => Int
然后我們使用參數(shù)1調(diào)用這個(gè)函數(shù)來(lái)生成第二個(gè)函數(shù)(回憶前面定義的閉包)。
scala> val second=first(1)
second: Int => Int = <function1>
scala> second(2)
res1: Int = 3
first,second的定義演示了柯里化函數(shù)的調(diào)用過(guò)程,它們本身和 curriedSum 沒(méi)有任何關(guān)系,但是我們可以使用 curriedSum 來(lái)定義 second,如下:
scala> val onePlus = curriedSum(1)_
onePlus: Int => Int = <function1>
下劃線“_” 作為第二參數(shù)列表的占位符, 這個(gè)定義的返回值為一個(gè)函數(shù),當(dāng)調(diào)用時(shí)會(huì)給調(diào)用的參數(shù)加一。
scala> onePlus(2)
res2: Int = 3
通過(guò)柯里化,你還可以定義多個(gè)類似 onePlus 的函數(shù),比如 twoPlus
scala> val twoPlus = curriedSum(2) _
twoPlus: Int => Int = <function1>
scala> twoPlus(2)
res3: Int = 4
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: