流式实现Stream.foldRight

时间:2013-11-07 03:54:46

标签: scala

我正在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

0 个答案:

没有答案