我正在尝试编写一个从存储库读取的函数(返回F[Option[Entry]]
,其中F
是未来),然后将其转换为F[Option[Element]]
。函数 convert()
采用 Seq[Entry]
并返回 ValidatedNel[LoadError, Seq[Element]]
。我试图这样做是为了理解,但我的问题是该函数返回F[Opt[F[Seq[Element]]]]
而不是F[Opt[Element]]
。我做错了什么?任何帮助都会很棒!
注意:已验证的Nel是猫的数据类型
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
}