【发布时间】:2019-04-12 10:22:23
【问题描述】:
我正在尝试使用过滤器操作来实现无限流。我想通过对尾部使用惰性求值使其不会因堆栈溢出错误而崩溃。
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?那是哪里/什么? -
抱歉,忘记添加了。它现在在那里
标签: scala stream lazy-evaluation