Scala Future/Option 理解问题

Scala Future/Option for comprehension issues

我正在尝试编写一个从存储库读取的函数(returns F[Option[Entry]],其中 F 是未来),然后将其转换为 F[Option[Element]]。函数 convert() 接受 Seq[Entry] 和 returns ValidatedNel[LoadError, Seq[Element]]。我正在尝试通过理解来做到这一点,但是我的问题是函数 returns F[Opt[F[Seq[Element]]]] 而不是 F[Opt[Element]]。我究竟做错了什么?任何帮助都会很棒!

注意: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
}

尝试使用 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
}