Scala未来/理解问题的选择

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

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

注意:ValidatedNel是cats数据类型

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
}
scala monads monad-transformers scala-cats for-comprehension
1个回答
1
投票

尝试使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.