更多剝皮的貓:
scala> List(1,2,3,4,5).inits.toList.reverse.tail
res0: List[List[Int]] = List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5))
scala> val is = List(1,2,3,4,5)
is: List[Int] = List(1, 2, 3, 4, 5)
scala> ((List.empty[List[Int]], List.empty[Int]) /: is) {
| case ((all, cur), i) => val next = cur :+ i ; ((all :+ next, next)) }
res3: (List[List[Int]], List[Int]) = (List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5)),List(1, 2, 3, 4, 5))
scala> (List(List(is.head)) /: is.tail) {
| case (all, i) => all :+ (all.last :+ i) }
res4: List[List[Int]] = List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5))
順便說一句,這是很慢,然後'scanLeft '變種。 – DaunnC 2015-03-25 08:08:21
@DaunnC爲什麼? ++操作在acc.length中是線性的,所以它將以任何方式爲二次方。 – 2015-03-25 08:17:48
是的,你說得對,我的機器上有一些錯誤或者其他問題(需要更多的研究)在Scala 2.10.3中,對於沒有完整的評論感到抱歉。 – DaunnC 2015-03-25 09:52:18