[英]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.