Scala未来/理解问题选项

Scala未来/理解问题选项,scala,monads,monad-transformers,scala-cats,for-comprehension,Scala,Monads,Monad Transformers,Scala Cats,For Comprehension,我试图编写一个函数,从存储库中读取数据(返回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

我试图编写一个函数,从存储库中读取数据(返回
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
}
覆盖def findByPath(键:字符串)(
暗指我:蒙纳德罗[F,可抛弃]
):F[选项[元素]]={
val结果=用于{

optionEntry尝试使用monad transformer
OptionT
并打开
元素的头部
序列(因为您将单个
条目
打包到序列中)

覆盖def findByPath(键:字符串)(
暗指我:蒙纳德罗[F,可抛弃]
):F[选项[元素]]={
val结果=用于{
进入我。纯(元素头)
))
}收益率
结果值
}

尝试使用monad transformer
option
并打开
元素的头部
序列(因为您将单个
条目
打包到序列中)

覆盖def findByPath(键:字符串)(
暗指我:蒙纳德罗[F,可抛弃]
):F[选项[元素]]={
val结果=用于{
进入我。纯(元素头)
))
}收益率
结果值
}
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
}