Поток бегущих сумм в Scala - PullRequest
       10

Поток бегущих сумм в Scala

4 голосов
/ 12 декабря 2011

Это продолжение моего предыдущего вопроса.
Данная функция add_stream(s1:Stream[Int], s2:Stream[Int]):Stream[Int] Я хотел бы кодировать running_sums(s:Stream[Int]):Stream[Int], который возвращает новый поток: s1, s1 + s2, s1 + s2 + s3, ...

Я могу думать о следующей реализации, но она не работает, если s пусто

def running_sums(s:Stream[Int]):Stream[Int] =
  Stream.cons(s.head, add_streams(s.tail, running_sums(s)))

Я могу исправить это следующим образом:

def running_sums(s:Stream[Int]):Stream[Int] =
  if (s.isEmpty) empty
    else Stream.cons(s.head, add_streams(s.tail, running_sums(s)))

Однако это не выглядит элегантно.

Как бы вы внедрили running_sums?

Ответы [ 2 ]

7 голосов
/ 12 декабря 2011

Есть вызов библиотеки для чего-то вроде этого, который называется scanLeft

s.scanLeft(0)(_+_).tail
5 голосов
/ 12 декабря 2011

А как же scanLeft?

scala> val sums = stream.scanLeft(List(0))((ns, n) => ns :+ (ns.last + n))
sums: scala.collection.immutable.Stream[List[Int]] = Stream(List(0), ?)

scala> sums take 5 foreach println
List(0)
List(0, 1)
List(0, 1, 3)
List(0, 1, 3, 6)
List(0, 1, 3, 6, 10)
...