私はScala での関数型プログラミングの演習に取り組んでいimplement foldRight on a Stream
ます。
その演習に入る前に、私がどのように を実装したかをお見せしましょう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
簡単に実行できると考えました。
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
ますか?