带折叠操作的Scala选项

时间:2015-10-27 00:00:11

标签: scala functional-programming

我正在尝试对fold使用mapmatch操作而不是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]

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

1 个答案:

答案 0 :(得分:7)

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

这里是fold的{​​{3}}:

  

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))