パターンに遭遇することが多いので、Scala ライブラリに便利なメソッドがないか調べてみました。
それを関数にしましょうf: A => Option[B]
。f
最初のx
, f(f(f(x).get).get...)
, まで繰り返し呼び出しを行い、最後の非値を保持したいと思いf
ます。None
None
私はこれの実装を書きました:
@tailrec
def recurrentCallUntilNone[B](f: B => Option[B], x: B): B = f(x) match {
case Some(y) => recurrentCallUntilNone(f, y)
case None => x
}
これはすでに標準ライブラリに実装されていますか?
この使用例は、現在の位置を保持するリスト (Zipper) の場合です。を呼び出すとnext
、None
現在の位置の後に要素がない場合、またはOption
同じリストの が現在の位置がインクリメントされている場合に返されます。上記のメソッドを使用するend
と、リストを最後までシークするメソッドを構築できます。