違いは、DSL と見なすことができる for 内包の解釈にあります。収量がある場合、理解はmapとflatMapを使用して何かに変換され、結果が収集されます。yield がない場合、式はforeachを使用して何かに変換され、結果を無視してすべての値を反復処理します。
一方、特定の条件が満たされるまで何かを実行し、何も返さない関数、つまり最後にUnitを返すだけの関数です。結果を返すためではなく、sied 効果のために呼び出されるだけです。したがって、yieldを使用しても、結果は破棄されます。
上記の実装は Iterator パターンを使用しており、foreachとまったく同じように機能します。
foreachのようにUnitを返します。
scala> val res : Unit = (1 to 10) foreach {i => i + 1}
一方for with yieldは結果を返し、map のように動作します。
scala> val res : Seq[Int] = (1 to 10) map {i => i + 1}
res: Seq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
scala> val res = for (i<- 1 to 10) yield i +1
res: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)