Вы можете использовать скольжение
l1.sliding(2).map { case Seq(a, b) => b - a } .sum
Но это не намного короче. Также, если у вас есть список, вы можете использовать l1.tail
вместо l1.drop(1)
.
я когда-то написал следующий метод расширения:
import collection.generic.CanBuildFrom
implicit final class RichIterableLike[A, CC[~] <: Iterable[~]](val it: CC[A])
extends AnyVal {
def mapPairs[B, To](fun: (A,A)=>B)(implicit cbf: CanBuildFrom[CC[A], B, To]): To = {
val b = cbf(it)
val iter = it.iterator
if (iter.hasNext) {
var pred = iter.next()
while (iter.hasNext) {
val succ = iter.next()
b += fun(pred, succ)
pred = succ
}
}
b.result()
}
}
С этим:
l1.mapPairs(-_+_).sum
'List (a1, a2, a3, ... An)' => '(a1 - a2) + (a2 - a3) +. .. + (aN-1 - aN) == a1 - aN' => 'diffs == l1.head - l2.last'. – senia