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 transformerOptionT
并打开元素的头部
序列(因为您将单个条目
打包到序列中)
覆盖def findByPath(键:字符串)(
暗指我:蒙纳德罗[F,可抛弃]
):F[选项[元素]]={
val结果=用于{
进入我。纯(元素头)
))
}收益率
结果值
}
尝试使用monad transformeroption
并打开元素的头部
序列(因为您将单个条目
打包到序列中)
覆盖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
}