2011-10-28 4 views

答えて

20

ファーストを期待していたものである「* 4」を返している:あなたの2行目のlazyやっていないもの、あなたはそれを削除して取得することができます同じ結果。

さらに重要な

:それはちょうど別のStreamを返し、それが必要になるまで、そのストリームの先頭過去何が評価されないことにtakeWhileは、実際怠け者です。次のことを考えてみましょう:

val s = Stream.from(1).takeWhile(_ > 0) 

をあなたと私はsが無限ストリームをするつもりであることを知っているが、我々はREPLを起動し、これを入力した場合、それを評価するために、完全に幸せです:

scala> val s = Stream.from(1).takeWhile(_ > 0) 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

あなたの例でも同じことが起こっています。takeWhileに渡された(Int) ⇒ Booleanは、ストリームの先頭を超えて何も供給されず、foreachのようなものが必要になるまで供給されません。

あなたはtakeWhile述語の内部printlnのようなものを追加することで、より劇的にこれを見ることができます:

scala> val s = Stream.from(1).takeWhile { x => println("Checking: " + x); x < 4 } 
Checking: 1 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> val l = s.toList 
Checking: 2 
Checking: 3 
Checking: 4 
l: List[Int] = List(1, 2, 3) 

明らかに我々はの評価を強制するまで、述語のみ、ストリームのヘッドのために呼び出されますストリームの残りの部分をtoListと呼んでください。

関連する問題