Często napotykam wzorzec, więc zastanawiałem się, czy w bibliotece Scala jest jakaś wygodna metoda.Powtarzające się wywołanie funkcji, dopóki nie zwróci żadnej Brak
Niech to będzie funkcja f: A => Option[B]
. Chciałbym wykonać powtarzające się wywołanie do f
zaczynając od x
, f(f(f(x).get).get...)
, aż f
zwraca None
i zachować ostatnią wartość inną niż None
.
pisałem implementację dla tego:
@tailrec
def recurrentCallUntilNone[B](f: B => Option[B], x: B): B = f(x) match {
case Some(y) => recurrentCallUntilNone(f, y)
case None => x
}
Czy to już wdrożony w bibliotece standardowej?
Przykład użycia może dotyczyć listy (Zipper), która zachowuje aktualną pozycję. Wywołanie: next
, None
jest zwracana, jeśli nie ma elementów po bieżącej pozycji lub Option
dla tej samej listy, ale z aktualną pozycją zwiększaną. Za pomocą powyższej metody można skonstruować metodę, która szuka listy do końca.
Nie ma go w bibliotece i robisz to we właściwy sposób. –
dodaj '@ tailrec'! –
To jest prawie ['unfold'] (http://daily-scala.blogspot.co.at/2009/09/unfoldleft-and-right.html).Ale wydaje się, że nie występuje w żadnych bibliotekach. – phg