Как эмулировать следующее поведение в Scala? то есть продолжать сбрасывать, пока выполняются некоторые определенные условия на аккумуляторе.
def foldLeftWhile[B](z: B, p: B => Boolean)(op: (B, A) => B): B
Например
scala> val seq = Seq(1, 2, 3, 4)
seq: Seq[Int] = List(1, 2, 3, 4)
scala> seq.foldLeftWhile(0, _ < 3) { (acc, e) => acc + e }
res0: Int = 1
scala> seq.foldLeftWhile(0, _ < 7) { (acc, e) => acc + e }
res1: Int = 6
ОБНОВЛЕНИЯ:
Основываясь на ответе @Dima, я понял, что мое намерение было немного побочным. Поэтому я сделал его синхронизированным с takeWhile
, т.е. продвижения не было бы, если предикат не совпадает. И добавьте еще несколько примеров, чтобы было понятнее. (Примечание: это не будет работать с Iterator
s)
(acc, e) => if (acc < 3) acc+e else acc
. Вы даже можете создать функцию более высокого порядка, чтобы создать окончательный аккумулятор из его базы и состояния. Я понимаю, что это может быть менее эффективно, чем ранний выход из фолда, но в остальном это выглядит эквивалентно. - person GPI   schedule 11.12.2018