可以參照對(duì)該函數(shù)的解析學(xué)習(xí)scala源碼分析的方法
/:以及:\ 可以看出是foldLeft和foldRight的簡(jiǎn)寫(xiě)(向左右折疊)
def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)
def :\[B](z: B)(op: (A, B) => B): B = foldRight(z)(op)
foldLeft
def foldLeft[B](z: B)(op: (B, A) => B): B = {// 注意:op溪北,op是一個(gè)操作,具體什么操作咨跌,要看實(shí)現(xiàn)
? var result = z
? this.seq foreach (x => result = op(result, x))
? ? result
}
op是一個(gè)閉包
方法接受2個(gè)參數(shù)丐重,z和op,一個(gè)是B類(lèi)型的參數(shù)轧葛,一個(gè)是返回B類(lèi)型的函數(shù)搂抒。
val listA = List(1,2尿扯,3)
我們可以直接使用:
scala> listA.foldLeft(0)((sum,i)=>sum+i)
res26: Int = 6
可見(jiàn)上面提到的op 就是 sum+i 是一個(gè)加的操作
// sum + i 后又賦值給sum求晶,然后不斷的foreach 調(diào)用這個(gè)op
這個(gè)里面的0其實(shí)就是z返回值是Int類(lèi)型即B類(lèi)型
那么可以看出op這個(gè)函數(shù)返回值也需要是Int類(lèi)型
val result = z, 這里其實(shí)就是0衷笋,x=>result=op(result, x)
這里我們執(zhí)行的是sum+i芳杏,就是累加了1+2+3=6
foldRight
先看下定義:
def foldRight[B](z: B)(op: (A, B) => B): B =
reversed.foldLeft(z)((x, y) => op(y, x))
這里多了一個(gè)reversed
// for internal use
protected[this] def reversed = {
var elems: List[A] = Nil
self.seq foreach (elems :: _)
elems
}
上面就是一個(gè)翻轉(zhuǎn)
在參數(shù)做了一個(gè)翻轉(zhuǎn)再調(diào)用foldLeft
(x,y) => op(y,x)
這樣寫(xiě)就對(duì)了:
scala> ((1 to 5)).foldRight(100)((i,sum)=>sum-i)
res49: Int = 85
總結(jié)一下,foldRight就是逆序集合辟宗,然后調(diào)用foldLeft
flodLeft的簡(jiǎn)寫(xiě) /:?
如果我寫(xiě)一個(gè)累加的程序
scala> (0/:(1 to 100))(_+_)
res32: Int = 5050
其實(shí)是等價(jià)于
scala> (1 to 100).foldLeft(0)(_+_)
res33: Int = 5050
foldRight的簡(jiǎn)寫(xiě) :\
如果我寫(xiě)一個(gè)遞減的程序
scala> ((1 to 5):\100)((i,sum)=> sum-i)
res51: Int = 85