2011-12-12 49 views
4

这是我之前问题的后续处理。
鉴于功能add_stream(s1:Stream[Int], s2:Stream[Int]):Stream[Int] 我想代码running_sums(s:Stream[Int]):Stream[Int],它返回一个新的流:s1, s1 + s2, s1 + s2 + s3, ...Scala运行总和流

我能想到以下实现的,但它不工作,如果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

回答

7

有一个库调用这样的事情,叫scanLeft

s.scanLeft(0)(_+_).tail 
5

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)