Scala Stream.foldRight的Stream-y实现

Scala Stream.foldRight的Stream-y实现,scala,Scala,我正在做一个练习,以在流上实现foldRight 在开始这个练习之前,让我展示一下如何实现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

我正在做一个练习,以
在流上实现foldRight

在开始这个练习之前,让我展示一下如何实现
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
    }
  }
我的理解是,通过
::
,我正在以尾部递归的流-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

谢谢,诺亚。在发布另一个
Scala中的FP是如何做到这一点的
问题之前,我将先查看github。没问题,这是一个很好的资源:)