简体   繁体   English

Scala 未来/理解问题的选项

[英]Scala Future/Option for comprehension issues

I am trying to write a function that reads from a repository (which returns F[Option[Entry]] where F is a future) and then converts it to F[Option[Element]] .我正在尝试编写一个 function ,它从存储库中读取(返回F[Option[Entry]] ,其中F是未来),然后将其转换为F[Option[Element]] The function convert() takes a Seq[Entry] and returns ValidatedNel[LoadError, Seq[Element]] . function convert()接受Seq[Entry]并返回ValidatedNel[LoadError, Seq[Element]] I am trying to do this with for comprehensions however my issue is that the function returns F[Opt[F[Seq[Element]]]] instead of F[Opt[Element]] .我试图用理解来做到这一点,但是我的问题是 function 返回F[Opt[F[Seq[Element]]]]而不是F[Opt[Element]] What am I doing wrong?我究竟做错了什么? Any help would be great!任何帮助都会很棒!

Note: ValidatedNel is a cats datatype注意:ValidatedNel 是一个猫数据类型

override def findByPath(key: String)(
  implicit ME: MonadError[F, Throwable]
): F[Option[Element]] = {
  val result = for {
    optionEntry <- repo.findByKey(key)
  } yield for {
    entry <- optionEntry
    elements = convert(Seq(entry))
  } yield elements.fold(
    reason => ME.raiseError[Seq[Element]](ClientError(reason)),
    ME.pure
  )
  result
}

Try to use monad transformer OptionT and unpack head of Element sequence (since you pack a single Entry into sequence)尝试使用 monad 转换OptionT并解压缩Element序列的头部(因为您将单个Entry打包到序列中)

override def findByPath(key: String)(
  implicit ME: MonadError[F, Throwable]
): F[Option[Element]] = {
  val result = for {
    entry <- OptionT(repo.findByKey(key))
    elements = convert(Seq(entry))
    res <- OptionT.liftF(elements.fold(
      reason => ME.raiseError[Element](ClientError(reason)),
      elems => ME.pure(elems.head)
    ))
  } yield res

  result.value
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM