我有兩個例子foldLeft,我無法真正掌握邏輯。
第一個例子:
val donuts: List[String] = List("Plain", "Strawberry", "Glazed")
println(donuts.foldLeft("")((acc, curr) => s" $acc, $curr Donut ")) // acc for accumulated, curr for current
這會給
, Plain Donut , Strawberry Donut , Glazed Donut
不foldLeft積累之前的價值?我期待結果是
, Plain Donut , Plain Strawberry Donut , Strawberry Glazed Donut
第二個例子:
def multi(num:Int,num1:Int):Int=num*10
(1 until 3).foldLeft(1)(multi)
有人可以解釋每一步發生了什么嗎?我看不出這怎么會變成 100。另外,第二個引數multi是一個函式。為什么它不接受任何輸入變數(num 和 num1)?
uj5u.com熱心網友回復:
不
foldLeft積累之前的價值?
是的,它確實。它使用先前迭代的結果和當前元素并產生新結果(使用您提供的二元運算子),因此對于第一個示例,接下來的步驟正在發生:
累加器的起始值 -
""acc = "",curr = "Plain"->" , Plain Donut "acc = " , Plain Donut ",curr = "Strawberry"->" , Plain Donut , Strawberry Donut "acc = " , Plain Donut , Strawberry Donut ",curr = "Strawberry"->" , Plain Donut , Strawberry Donut , Glazed Donut"
對于第二個示例,當前值被簡單地忽略 - 即multi可以重寫為def multi(acc:Int, curr:Int):Int = acc*10實際curr未使用的位置,因此foldLeft只需將起始值 ( 1) 乘以 10n倍 wheren是序列中的元素數(即為(1 until 3).length2)。
為什么它不接受任何輸入變數(num 和 num1)?
foldLeft是一個接受函式的函式。它接受一個泛型函式,該函式又接受兩個引數并回傳與第一個引數相同型別的結果(op: (B, A) => B,其中B是結果型別,A是序列元素型別)。當== ==multi時匹配此定義并傳遞給which 將在內部提供每一步的輸入變數。BAIntfoldLeft
uj5u.com熱心網友回復:
左折疊需要三樣東西:要處理的串列、初始值和函式。
該函式獲取串列的每個元素并將其應用于初始值。每次,初始值都是前一個函式應用的結果。
總結一個串列是一個很好的玩具例子。
val nums = List(1, 2, 3, 4)
val total = nums.foldLeft(0)((a, b) => a b)
total是10。
該初始值必須通過您需要的所有狀態。當前,您傳遞累積的字串。您應該傳遞的是一個元組,為您的函式提供額外的資訊來處理:累積的字串,以及表示串列中前一個元素的字串。
您的結果將類似于:
("Plain donut, ...", "Glazed")
然后你只需要選擇出累積的字串并丟棄第二個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/453088.html
上一篇:如何正確地將隱式引數傳遞給模塊?
