2016-03-28 42 views
0

我想知道在for-yield塊的scala中的控制流程。我發現所有元素都先經過'for'部分,然後是'yield'部分。這是爲什麼?如果它不能成爲收益的部件1,對於產量爲element2的...Scala for-yield控制流程

scala> val list = List(1,2,3,4,5,6) 
list: List[Int] = List(1, 2, 3, 4, 5, 6) 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

val t = for { 
    i <- list 
    log = println("processing " + i) 
} yield { 
    println("In yield for " + i) 
    i 
} 

// Exiting paste mode, now interpreting. 

processing 1 //All of them first go through the for block 
processing 2 
processing 3 
processing 4 
processing 5 
processing 6 
In yield for 1 // yield comes after all 
In yield for 2 
In yield for 3 
In yield for 4 
In yield for 5 
In yield for 6 
t: List[Int] = List(1, 2, 3, 4, 5, 6) 
+0

這取決於您在「for」中的第一件事。 試試'Stream'而不是'List' – Dima

+0

你能說說這個評論嗎?試過流,它只是處理第一個元素。爲什麼列表行爲這種特殊的方式是我想知道的。 – Richeek

+0

「列表表現出這種特殊的方式」,因爲這就是它的實現方式。 '流'是以不同的方式實現的。要將'.toList'添加到剪切末尾,「剛剛處理第一個元素」 – Dima

回答

3

您的代碼

val t = for { 
    i <- list 
    log = println("processing " + i) 
} yield { 
    println("In yield for " + i) 
    i 
} 

大致desugars到

val t = list.map { i => 
    val log = println("processing " + i) 
    (i, log) 
}.map { x => 
    x match { 
     case (i, log) => 
      println("In yield for " + i) 
    } 
} 

從這裏你可以看到爲什麼你首先得到所有的「處理...」消息。

+0

謝謝。說得通 – Richeek