当前位置: 首页 > 知识库问答 >
问题:

Scala Future/Option for comprehension issues

祖奇
2023-03-14

我正在尝试编写一个从存储库读取的函数(返回F[Option[Entry]],其中F是未来),然后将其转换为F[Option[Element]]。函数 convert() 采用 Seq[Entry] 并返回 ValidatedNel[LoadError, Seq[Element]]。我试图这样做是为了理解,但我的问题是该函数返回F[Opt[F[Seq[Element]]]]而不是F[Opt[Element]]。我做错了什么?任何帮助都会很棒!

注意:已验证的Nel是猫的数据类型

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
}

共有1个答案

闻人思聪
2023-03-14

尝试使用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
}
 类似资料:

相关问答

相关文章

相关阅读