2015-10-27 100 views
0

我想使用foldmap操作而不是matchOption折叠操作的斯卡拉选项

我有一个选项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]

那么,为什么地图在这里工作,但没有折叠,我错过了这里的东西?

回答

6

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

这里的Scala docfold

fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
返回将F到这个scala.Option的值,如果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)) 
+2

使用Option.empty [T]是使用类型归属的替代方法。 –