2011-12-12 61 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)