gpt4 book ai didi

具有折叠操作的 Scala 选项

转载 作者:行者123 更新时间:2023-12-04 19:52:04 26 4
gpt4 key购买 nike

我正在尝试对 Option 使用 foldmap 操作而不是 match

我有一个选项 val ao: Option[String] = xxxx 和一个函数 f: (String => Future[Option[T]])

如果我做模式匹配是:

ao match {
case Some(t) => f(t)
case None => Future.successful(None)
}

如果我做 map 是:

ao map f getOrElse Future.successful(None)

但是当我折叠时,我得到了一些以下编译器错误:

ao.fold(Future.successful(None))(t => f(t))

关于提示 expression Future[Option[T]] doesn't confirm to Future[None.type]

那么为什么 map 在这里可以工作,但不能折叠,我在这里错过了什么吗?

最佳答案

这样做的原因是 Scala 试图派生返回类型 None.type 这有点像列表的 Nil ,因为只有一个对象 ( None) 存在并且在所有情况下都向上转换,因为它是 Option[Nothing]。为了解决这个问题,您应该明确定义类型。

这里是 Scala doc 折叠:

fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
Returns the result of applying f to this scala.Option's value if the scala.Option is nonempty. Otherwise, evaluates expression ifEmpty.

编译器认为 [B]None.type。所以试着这样调用它:

ao.fold[Future[Option[T]]](Future.successful(None))(t => f(t))

或使用类型描述来调用它:

ao.fold(Future.successful(None: Option[T]))(t => f(t))

关于具有折叠操作的 Scala 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com