【问题标题】:Scala Future/Option for comprehension issues用于理解问题的 Scala 未来/选项
【发布时间】:2020-03-12 10:04:02
【问题描述】:

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

注意: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
}

【问题讨论】:

    标签: scala monads monad-transformers scala-cats for-comprehension


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多