Ответы scan
являются лучшими, но стоит отметить, что можно сделать складку лучше и / или короче, чем в вашем вопросе. Во-первых, вам не нужно использовать сопоставление с образцом:
a.foldLeft(List(0)){ (l,i) => (l.head + i) :: l }.reverse
Во-вторых, обратите внимание, что foldLeft имеет сокращение:
(List(0) /: a){ (l,i) => (l.head + i) :: l }.reverse
В-третьих, обратите внимание, что при желании вы можете использовать коллекцию, которая может эффективно добавляться, чтобы вам не нужно было переворачиваться
(Vector(0) /: a){ (v,i) => v :+ (v.last + i) }
Так что, хотя это не так компактно, как scanLeft
:
a.scanLeft(0)(_ + _)
все еще не так уж плохо.