2011-12-12 90 views
2

我看到至少有两种不同的实现:添加流在斯卡拉

def add_streams(s1:Stream[Int], s2:Stream[Int]): Stream[Int] = 
    Stream.cons(s1.head + s2.head, add_stream(s1.tail, s2.tail))
def add_streams(s1:Stream[Int], s2:Stream[Int]) = 
    (s1 zip s2) map {case (x,y) => x + y}

我想最后一个是更有效,因为它是不是递归。
它是正确的吗?你将如何编写这样的功能?

回答

5

第一个版本被打破,因为它不检查Stream的结尾。 (这些流不需要具有不同的长度。)鉴于此,zip版本是更喜欢的版本。

2

首先:当任何一个流是有限的时候,你的实现有不同的行为。第一个将会以NoSuchElementException的速度崩溃,而第二个会截断更长的流。

我发现后者更富有表现力和优雅,不管怎样,尽管我怀疑性能差异在大多数情况下会显着。