加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala 2.12组合Future和Either(有偏见的版本)

发布时间:2020-12-16 18:13:25 所属栏目:安全 来源:网络整理
导读:我有两个方法,两个都返回Future [Either [String,T]],并希望将它们链接在一起以完成工作.我正在使用 Scala 2.12现在两者都是正确的偏见. 例如, 如果函数没有返回Future和Either组合,我可以简单地执行以下操作以获得理解. def convert(a,b) = ???def callA():
我有两个方法,两个都返回Future [Either [String,T]],并希望将它们链接在一起以完成工作.我正在使用 Scala 2.12现在两者都是正确的偏见.

例如,

如果函数没有返回Future和Either组合,我可以简单地执行以下操作以获得理解.

def convert(a,b) = ???
def callA(): Future[A] = ???
def callB(a: A): Future[B] = ???

def chain: Future[C] = for {
  a <- callA
  b <- callB(a)
} yield convert(a,b)

但现在我想用以下语法使用Either捕获错误,并传播到最终结果.实现这一目标的最佳方法是什么?还应该使用callB还是callB1?

def convert(a,b): Future[Either[String,C]] = ???
def callA(): Future[Either[String,A]] = ???
def callB(a: A): Future[Either[String,B]] = ??? or 
def callB1(eithera: Either[String,A]): Future[Either[String,B]] = ???

我知道使用cat变换monad可以简化这一点.欢迎给我使用标准库和猫的解决方案.

解决方法

正如评论所提到的,这是猫和scalaz可以处理的东西.但我也能理解不要为一小段逻辑引入另一个依赖或复杂的愿望.如果您想自己实现,可以执行以下操作:

implicit class FutureEither[A](val wrapped: Future[Either[String,A]])(implicit ec: ExecutionContext) {
  def map[B](f: A => B): FutureEither[B] = wrapped.map(_.map(f))

  def flatMap[B](f: A => FutureEither[B]): FutureEither[B] = wrapped.flatMap {
    case Left(s) => Future(Left(s))
    case Right(a) => f(a).wrapped
  }
}

使用适当的类型实现map和flatMap可以实现完全相同的for-understanding理解:

def convert(a: A,b: B): C = ???
def callA(): FutureEither[A] = ???
def callB(a: A): FutureEither[B] = ???

def chain: FutureEither[C] = for {
  a <- callA()
  b <- callB(a)
} yield convert(a,b)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读