2015-10-27 101 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]是使用類型歸屬的替代方法。 –