簡體   English   中英

懶惰的scala中的理解評估

[英]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理解僅僅是糖flatMapmapwithFilter方法調用。 因此,如果您的支持數據結構是嚴格的(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM