Я только начал оценивать ZIO, чтобы улучшить модель программирования и производительность моего асинхронного Scala кода. В моей кодовой базе я часто имею дело с Future[Option[T]]
, и до этого момента я имел дело с этим, используя OptionT
монадный преобразователь Scalaz. Теперь я хочу попробовать это с ZIO.
Рассмотрим две функции:
def foo: String => Future[Option[T]]
и def bar: T => Future[U]
Я пробовал что-то вроде этого:
val t = for {
o: Option[Int] <- ZIO.fromFuture { implicit ec =>
foo("test")
}
i: Int <- ZIO.fromOption(o)
s: String <- ZIO.fromFuture { implicit ec =>
bar(i)
}
} yield s
Согласно моей IDE, t
имеет тип ZIO[Any, Any, String]
в этом сценарии. Я не знаю, что с этим делать.
Я хочу рассмотреть три варианта:
- Случай "успеха", когда
foo
производит Some
, который может быть составлено с другими функциями по значению - Случай, когда
foo
выдает None
- Случай, когда любая функция выдает ошибку
Я не являюсь уверен, как проанализировать эти возможности в этом сценарии с ZIO. Любая помощь приветствуется.