2014-07-14 170 views
1

我正在嘗試學習如何使用摺疊向左並向右摺疊。這是我第一次學習函數式編程。我無法理解什麼時候使用摺疊,何時使用摺疊。在我看來,很多時候這兩種功能是可以互換的。例如(在Scala中)這兩個函數:向左摺疊並向右摺疊

val nums = List(1, 2, 3, 4, 5) 

val sum1 = nums.foldLeft(0) { (total, n) => 
    total + n 
} 
val sum2 = nums.foldRight(0) {(total, n) => 
    total + n 
} 

兩者都產生相同的結果。爲什麼和什麼時候我會選擇一個或另一個?

+0

現在嘗試減去或做除法,看看你是否仍然得到相同的答案... – alfasin

回答

0

foldleft和foldright的功能嵌套方式不同。

foldleft: (((...) + a) + a) + a 
foldright: a + (a + (a + (...))) 

由於您使用的函數是加法,它們都給出了相同的結果。嘗試使用減法。

此外,使用摺疊(左/右)的動機不是結果 - 在大多數情況下,兩者都產生相同的結果。這取決於你希望你的功能被聚合到哪個位置。