带折叠操作的Scala选项

ttt*_*ttt 2 functional-programming scala

我试图使用foldmap操作,而不是matchOption.

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

如果我做模式匹配是:

ao match {
  case Some(t) => f(t)
  case None => Future.successful(None)
}
Run Code Online (Sandbox Code Playgroud)

如果我做地图是:

ao map f getOrElse Future.successful(None)
Run Code Online (Sandbox Code Playgroud)

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

ao.fold(Future.successful(None))(t => f(t))
Run Code Online (Sandbox Code Playgroud)

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

那么为什么地图在这里工作但不折叠,我在这里错过了什么?

Lal*_*lin 8

这样做的原因是Scala正在尝试派生返回类型None.type,这种类型就像Nil列表一样,只有一个object(None)存在并且在所有情况下都是upcast,因为它是Option[Nothing].要解决这个问题,您应该明确定义类型.

这里是斯卡拉文档fold:

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))
Run Code Online (Sandbox Code Playgroud)

或者使用类型归属来调用它:

ao.fold(Future.successful(None: Option[T]))(t => f(t))
Run Code Online (Sandbox Code Playgroud)

  • 使用Option.empty [T]是使用类型归属的替代方法. (3认同)