Я часто сталкиваюсь с шаблоном, поэтому мне было интересно, есть ли в библиотеке 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
, который ищет список до конца.
Это не в библиотеке, и вы делаете это правильно. –
добавить '@ tailrec'! –
Это почти ['unfold'] (http://daily-scala.blogspot.co.at/2009/09/unfoldleft-and-right.html).Но это не происходит в каких-либо библиотеках. – phg