什么时候是scala';什么是理解?

什么时候是scala';什么是理解?,scala,lazy-evaluation,for-comprehension,Scala,Lazy Evaluation,For Comprehension,在Python中,我可以执行以下操作: lazy = ((i,j) for i in range(0,10000) for j in range(0,10000)) sum((1 for i in lazy)) 这需要一段时间,但内存使用是恒定的 scala中的相同构造: (for(i<-0 to 10000; j<-i+1 to 10000) yield (i,j)).count((a:(Int,Int)) => true) (对于(i对于Scala的理解来说,没有什么是天生懒惰

在Python中,我可以执行以下操作:

lazy = ((i,j) for i in range(0,10000) for j in range(0,10000))
sum((1 for i in lazy))
这需要一段时间,但内存使用是恒定的

scala中的相同构造:

(for(i<-0 to 10000; j<-i+1 to 10000) yield (i,j)).count((a:(Int,Int)) => true)

(对于(i对于Scala的理解来说,没有什么是天生懒惰的;它是语法糖*,它不会改变两个范围的组合将是渴望的这一事实

如果您使用范围的lazy
view
s,理解的结果也将是lazy:

scala> for(i<-(0 to 10000).view; j<-(i+1 to 10000).view) yield (i,j)
res0: scala.collection.SeqView[(Int, Int),Seq[_]] = SeqViewN(...)

scala> res0.count((a: (Int, Int)) => true)
res1: Int = 50005000

懒惰不是来自理解,而是来自收藏本身。你应该了解收藏的严格性特征


但是,对于懒惰者:-),这里有一个总结:
迭代器
是不严格的,任何集合的
视图
的选择方法也是不严格的。因此,如果你想懒惰,一定要
.Iterator
视图
你的集合,但后一个表达式似乎返回100020001个元素,而不是50005000个。威士忌探戈狐步?@Malvolio感谢您的注意!
j
应该是从
i+1到10000
,而不是
1到10000
。现已修复。哦,我应该注意到解决方案,而不仅仅是问题。我当时正盯着map函数,忽略了参数..在2.7中Int.to(Int)不是很懒吗?
(0 to 10000).flatMap(i => (i+1 to 10000).map(j => (i, j)))