我正在implement foldRight on a Stream
进行Functional Programming in Scala练习。
在开始练习之前,让我先说明我是如何实施的foldLeft
。
def foldLeft[A, B](as: Stream[A])(z: B)(f: (B, A) => B): B = {
def go(bs: Stream[A], acc: B) : B = bs match {
case x #:: xs => go(xs, f(acc, x))
case Stream() => acc
}
}
我的理解是,通过#::
,我以尾递归和 stream-y方式执行折叠,即尾部未完全评估。
然而,当我想到如何实施foldRight
时,我想我可以这样做:
stream.reverse.foldLeft(monoid.zero)(monoid.op)
但是,调用reverse
将导致对流的完整评估:
scala> val x = Stream(1,2,3)
x: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> x.reverse
res15: scala.collection.immutable.Stream[Int] = Stream(3, 2, 1)
我如何流式传输实施foldRight
?