我正在尝试使用过滤操作实现一个无限流。我希望通过对尾部进行惰性求值来避免堆栈溢出错误。
abstract class MyStream[+A] {
def head: A
def tail: MyStream[A]
def #::[B >: A](element: B): MyStream[B] // prepend operator
def filter(predicate: A => Boolean): MyStream[A]
}
class FiniteStream[+A](val head: A, val tail: MyStream[A]) extends MyStream[A] {
override def #::[B >: A](element: B): MyStream[B] = new FiniteStream[B](element, this)
override def filter(predicate: A => Boolean): MyStream[A] = {
lazy val filteredTail = tail.filter(predicate)
if (predicate(head)) filteredTail
else filteredTail
}
}
class InfiniteStream[+A](override val head: A, generator: A => A) extends MyStream[A] {
override def tail: MyStream[A] = {
lazy val tail = new InfiniteStream[A](generator(head), generator)
tail
}
override def #::[B >: A](element: B): MyStream[B] =
new FiniteStream[B](element, this)
override def filter(predicate: A => Boolean): MyStream[A] = {
lazy val filteredTail = tail.filter(predicate)
if (predicate(head)) head #:: filteredTail
else filteredTail
}
}
object MyStream {
def from[A](start: A)(generator: A => A): MyStream[A] = new InfiniteStream[A](start, generator)
}
val stream: MyStream[Int] = MyStream.from(1)((n: Int) => n + 1)
val filtered = stream.filter(_ % 2 == 0)
但是这个程序确实会因为堆栈溢出错误而崩溃。看起来我的惰性求值策略并没有奏效。尾部仍然在被计算。为什么?
FiniteStream
?那是什么?在哪里/是什么? - jwvh