gpt4 book ai didi

scala - scala 的 for-comprehensions 什么时候懒惰?

转载 作者:行者123 更新时间:2023-12-03 21:10:47 24 4
gpt4 key购买 nike

在 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)

过了一会儿,我收到了 java.lang.OutOfMemoryError ,即使它应该被懒惰地评估。

最佳答案

Scala 的 for-comprehension 没有什么本质上是懒惰的;这是语法糖* 不会改变您的两个范围的组合将是急切的事实。

如果你和懒惰的人一起工作 view s 你的范围,理解的结果也会很懒惰:

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

这里的懒惰与for-comprehension无关,而是因为当 flatMapmap (见下文)在某种类型的容器上调用,您会在相同类型的容器中返回结果。所以,for-comprehension 只会保留你输入的任何东西的懒惰(或缺乏)。

*例如:
(0 to 10000).flatMap(i => (i+1 to 10000).map(j => (i, j)))

关于scala - scala 的 for-comprehensions 什么时候懒惰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com