Scala で関数型プログラミングを行っているときに、次のコード スニペットを見つけました。
def foldRight[A](z: => B)(f: (A,=>B) => B):B = uncons match {
case Some((h,t)) => f(h,t.foldRight(z)(f))
case None => z
}
その後、著者は先に進み、次のように述べています。
これは List 用に書いた foldRight と非常によく似ていますが、結合関数 f の 2 番目のパラメーターが厳密ではないことに注意してください。f がその 2 番目のパラメーターを評価しないことを選択した場合、これによりトラバーサルが早期に終了します。これは、foldRight を使用して exists を実装することで確認できます。これは、ストリーム内のいずれかの値が特定の述語と一致するかどうかを確認します。
そして、著者は次のように述べています。
def exists(p: A => Boolean): Boolean =
foldRight(false)((a, b) => p(a) || b)
私の質問は、結合関数 f がどのようにして exists メソッドで早期終了を引き起こすのですか? テキストからは、それがどのように起こるかを理解できなかったと思います。