[英]Scala Option with fold operation
我正在尝试使用fold
或map
操作而不是match
Option
。
我有一个Option val ao: Option[String] = xxxx
和一个函数f: (String => Future[Option[T]])
如果我做模式匹配是:
ao match {
case Some(t) => f(t)
case None => Future.successful(None)
}
如果我做地图是:
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]
那么为什么地图在这里工作但不折叠,我在这里错过了什么?
这样做的原因是Scala正在尝试派生返回类型None.type
,它对于列表来说就像Nil
一样,只有一个对象( None
)存在并且在所有情况下都是upcast,因为它是Option[Nothing]
。 要解决这个问题,您应该明确定义类型。
这是fold
的Scala文档 :
fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
如果scala.Option为非空,则返回将f应用于此scala.Option的值的结果。 否则,计算表达式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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.