1

私は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ますか?

4

0 に答える 0