假设我们有以下LazyList定义:
val fibs: LazyList[BigInt] = BigInt(0) #:: BigInt(1) #::
fibs.zip(fibs.tail).map(pair => pair._1 + pair._2)我的问题是它是如何执行的,因为这个定义说我们取尾,然后对每对进行计算(从zip)。但是如果我们想用索引10来计算元素,我们已经有了...8,9的值。这是在某种程度上优化了,还是对于下一个元素,我们会遍历所有的对?
发布于 2020-09-10 14:38:21
加上-
#::操作符/方法最终创建了一个新的类,这是库代码-隐式def toDeferrerA:DeferrerA =新延迟器A最终类DeferrerA私有LazyList扩展AnyVal { /**构造由给定的第一个元素组成的LazyList,后面跟着来自另一个LazyList的元素*。*/ def #::B >: A:LazyListB = newLL(sCons(elem,l()) /**构造一个LazyList,其中包含给定LazyList和*另一个LazyList的连接。*/ def #:B >: A:LazyListB =前缀lazyAppendedAll l() }
那么,创建对象的顺序是-
在fibs.zip(fibs.tail).map(pair => pair._1 + pair._2)
#::,我们附加了一个新的head #::,我们又给LinkedList BigInt(0)附加了一个新的头,现在我们的递归结构已经准备好了。当我们呼唤头,我们开始展开包装,然后懒惰开始采取行动。
此外,LazyList内部使用这种状态结构来建模头和尾
private sealed trait State[+A] extends Serializable {
def head: A
def tail: LazyList[A]
}这个结构是它对每个元素的第一次访问的回忆录。
private lazy val state: State[A] = { ... }https://stackoverflow.com/questions/63829674
复制相似问题