使用ZIO在Scala中组成多个期货和期权

问题描述 投票:1回答:1

我刚刚开始评估ZIO,以改善编程模型和异步Scala代码的性能。在我的代码库中,我经常处理Future[Option[T]],至此,我已经使用Scalaz的OptionT monad转换器进行了处理。现在,我想与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解析那些可能性。任何帮助表示赞赏。

我刚刚开始评估ZIO,以改善编程模型和异步Scala代码的性能。在我的代码库中,我经常处理Future [Option [T]],到目前为止,我已经处理过...

scala functional-programming scalaz zio
1个回答
1
投票

ZIO.fromOption的类型是IO[Unit, A],即ZIO[Any, Unit, A],而ZIO.fromFuture的类型是Task[A],即ZIO[Any, Throwable, A]。因此类型不对齐

© www.soinside.com 2019 - 2024. All rights reserved.