[英]Lazy for comprehension evaluation in scala
我是scala和大多數函數式語言的新手,我現在正試圖計算一個數字。 我寫了代碼:
lazy val factors = for(int <- 2 until math.ceil(math.sqrt(number)).toInt if number%int == 0) yield int
我想知道如果我宣稱scala val是懶惰的,當我調用factors.head
時,它不會評估整個理解嗎?
你的factors
變量是懶惰的; 在for
理解並非如此。 當您第一次訪問factors
時,將完全評估您for
理解。
在Scala中, for
理解僅僅是糖flatMap
, map
和withFilter
方法調用。 因此,如果您的支持數據結構是嚴格的(例如Range
- 您正在使用的),您for
理解也將是嚴格的。 如果數據結構是懶(如Stream
),因此將for
理解。
觀察差異:
scala> val number = 50
number: Int = 50
scala> lazy val factors = for(int <- 2 until math.ceil(math.sqrt(number)).toInt if number%int == 0) yield int
factors: scala.collection.immutable.IndexedSeq[Int] = <lazy>
scala> factors.head
res5: Int = 2
scala> factors
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 5)
scala> lazy val factors = for(int <- Stream.range(2, math.ceil(math.sqrt(number)).toInt - 1) if number%int == 0) yield int
factors: scala.collection.immutable.Stream[Int] = <lazy>
scala> factors.head
res7: Int = 2
scala> factors
res8: scala.collection.immutable.Stream[Int] = Stream(2, ?)
不。這是完全不同的事情: lazy
意味着值是在您第一次訪問它時計算的。 如果您想要對集合進行延遲計算,則應使用Stream
或使用視圖。 可以使用view
從集合構建Stream
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.