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。没问题,这是一个很好的资源:)