Scala的閉包和柯里化

2021-09-24 11:46:36 字數 1887 閱讀 7279

1、scala中的閉包:

閉包是指有權訪問另外乙個函式作用域中的變數的函式。可以理解為能夠讀取另乙個函式作用域的變數的函式。

乙個函式的函式體是乙個新的函式,這個函式體函式是閉包(有權訪問另外乙個函式作用域中的變數)

閉包可以作為函式引數傳遞

val filteralllogclasrdd = caseclassalllogrdd.filter(filtercondition(_, validprojectssetbroad.value))
變數不在函式作用域中時,還可以訪問。閉包可以作為變數或者返回值

def mulby(factor:double) = (x:double) => factor * x

//開始呼叫

val tripe = mulby(3)

val half = mulby(0.5)

println(tripe(14) + " " + half(14))

這就是乙個閉包

2、scala中的柯里化

//柯里化的前提是scala支援閉包,才會有柯里化

def add(x:int)(y:int) = x + y實際演化成了def add(x:int)=(y:int)=>x+y(後者用到了閉包)

柯里化(currying)指的是將原來接受兩個引數的函式變成新的接受乙個引數的函式的過程。新的函式返回乙個以原有第二個引數為引數的函式。

首先我們定義乙個函式:

def add(x:int,y:int)=x+y
那麼我們應用的時候,應該是這樣用:add(1,2)

現在我們把這個函式變一下形:

def add(x:int)(y:int) = x + y
那麼我們應用的時候,應該是這樣用:add(1)(2),最後結果都一樣是3,這種方式(過程)就叫柯里化。

add(1)(2) 實際上是依次呼叫兩個普通函式(非柯里化函式),第一次呼叫使用乙個引數 x,返回乙個函式型別的值,第二次使用引數y呼叫這個函式型別的值。

實質上最先演變成這樣乙個方法:

def add(x:int)=(y:int)=>x+y
那麼這個函式是什麼意思呢? 接收乙個x為引數,返回乙個匿名函式,該匿名函式的定義是:接收乙個int型引數y,函式體為x+y。現在我們來對這個方法進行呼叫。

val result = add(1)
返回乙個result,那result的值應該是乙個匿名函式:(y:int)=>1+y

所以為了得到結果,我們繼續呼叫result。

val sum = result(2)
最後列印出來的結果就是3。

下面是乙個完整例項:

object test 

def strcat(s1: string)(s2: string) =

}執行以上**,輸出結果為:

$ scalac test.scala

$ scala test

str1 + str2 = hello, scala!

案例二

def aggregate[u](zerovalue: u)(seqop: (u, t) ⇒ u, combop: (u, u) ⇒ u)(implicit arg0: classtag[u]): u

##第乙個分割槽中包含5,4,3,2,1

##第二個分割槽中包含10,9,8,7,6

scala> rdd1.aggregate(1)(

| ,

|

| )

res17: int = 58

理解Scala閉包和柯里化

柯里化 def add a int b int a b 等價於 def add a int,b int a bpackage com.zhengkw.scala.day03 classname closure author zhengkw description date 20 04 22下午 3 ...

Scala柯里化和反柯里化

名詞解釋 在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。柯里化舉例說明 def curry1 a,b,c a a,f a,b c b c b b f a,b 這個函式的結果是乙個高階...

閉包與柯里化

一 柯里化的概念 在電腦科學中,柯里化是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。這個技術由christopher strachey以邏輯學家 haskell curry 命名的,儘管它是 moses schnfinke...