繁体   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