Распространенной ситуация, которую я нашел myselfe с использованием Scala является следующим потоком:Закономерность в типизированной функциональном программировании Опции [Future [Int]] преобразована в будущее [Опция [Int]]
- Прочитайте некоторый реквизит которым возвращает
Option
- Использование реквизита в
Future
- сделать некоторые преобразования по результатам в будущем, которое возвращает
Option
Это дает типа, такие как Option[Future[Option[_]]]
лучшим решением будет использовать такое преобразование, как Future[Option[Option[_]]]
, например, используя что-то вроде ниже:
def transform[A](o: Option[Future[A]]): Future[Option[A]] =
o.map(f => f.map(Option(_))).getOrElse(Future.successful(None))
(код украденного из here)
Тогда я мог бы работать с произвольным числом Options
внутри Future
с использованием flatmap
.
Это похоже на такой общий шаблон, что я уверен, что он доступен в Scala каким-то идеоматическим способом, без необходимости повторять метод преобразования снова и снова.
Так что мой вопрос: какой самый идеоматичный способ превратить Option[Future[Option[_]]]
снаружи, как в приведенном выше примере?
Монографический трансформатор может быть тем, что вы ищете. – mfirry
Вопрос говорит, что вы хотите «Option [Future [A]] => Future [Option [A]]', но детали, похоже, говорят, что вы хотите «Option [Option [... Option [A]]] => Option [ A] '? Итак, что это? Можете ли вы привести пример? – Cubic