2016-03-08 71 views
3

試圖瞭解爲什麼以下表達式產生未來[沒有],而不是未來未來結果[列表[INT]]理解爲什麼有用於理解產生未來[沒有]

def foo(): Future[List[Int]] = Future(List(1,2,3,3,3,4,4,4)) 
def bar(): Future[Nothing] =for { 
    fooList <- foo() 
    f <- fooList.distinct 
} yield f 
當然

,這是簡化的示例,我可以直接返回fooList。但我想了解越來越Future[Nothing]而不是Future[List[Int]]

+0

我得到的控制檯上的類型不匹配,這是我所期待的。 – ziggystar

回答

6

我得到一個編譯錯誤的代碼,這是意料之中的,因爲fooList.distinct本來應該用於提取<-上班就可以了一Future的原因。

scala> def foo() = Future(List(1,2,2,3)) 
foo:()scala.concurrent.Future[List[Int]] 


scala> for(fooList <- foo(); f <- fooList.distinct) yield f 
<console>:17: error: type mismatch; 
found : List[Int] 
required: scala.concurrent.Future[?] 
       for(fooList <- foo(); f <- fooList.distinct) yield f 
            ^

此代碼編譯:

scala> for(fooList <- foo(); f = fooList.distinct) yield f 
res4: scala.concurrent.Future[List[Int]] = [email protected] 

而這種代碼也(包裝調用distinct成未來):

scala> for(fooList <- foo(); f <- Future(fooList.distinct)) yield f 
res5: scala.concurrent.Future[List[Int]] = [email protected] 
res4: scala.concurrent.Future[List[Int]] = [email protected] 
+0

謝謝。 (它在IDE上編譯,應該試過repl) – igx

+0

這個答案沒有解釋爲什麼OP的方法無效。 – Haspemulator

+0

@Haspemulator第一句話呢?我可以更深入地解釋它。但也許這並不總是有用的。 – ziggystar

2

Scala的換理解只是語法糖方法flatMap,mapfilter。 A碼

for { 
    x1 <- e1 
    x2 = e2 
    x3 <- e3 if e4 
    x4 <- e5 
} yield e6 

轉化爲(或等價的東西)

e1.flatMap(x1 => 
e2.map(x2 => 
e3.filter(x3 => e4).flatMap(x3 => 
e5.map(x4 => e6) 

換理解你的榜樣變得

foo().flatMap(fooList => fooList.distinct.map(f => f)) 

這相當於

foo().flatMap(fooList => fooList.distinct) 

由於map(id) = id的定義是什麼Functor是。方法foo().flatMap需要List[Int] ⇒ Future[S]類型的參數。但功能fooList => fooList.distinct的類型是List[Int] => List[Int]。編譯器檢查提供的類型是否是預期類型的​​子類型。在你的情況下,檢查落到:List[Int]Future[S]某種類型S一個亞型。我不知道爲什麼S的執行類型是Nothing,但它可能與Future是協變的(因爲任何Functor都應該)有關。

給定類型的將來Future[T]mapflatMap都產生一個Future[S]但不同的是:

  • map需要T => S類型的參數。 語法x = ...
  • flatMap需要T => Future[S]類型的參數。 語法x <- ...

你想用的方法則map這給

for (fooList <- foo()) 
yield fooList.distinct 

foo().map(fooList => fooList.distinct) 
相關問題