首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的LazyList

Scala中的LazyList
EN

Stack Overflow用户
提问于 2020-09-10 12:27:09
回答 1查看 1K关注 0票数 3

假设我们有以下LazyList定义:

代码语言:javascript
复制
val fibs: LazyList[BigInt] = BigInt(0) #:: BigInt(1) #::
fibs.zip(fibs.tail).map(pair => pair._1 + pair._2)

我的问题是它是如何执行的,因为这个定义说我们取尾,然后对每对进行计算(从zip)。但是如果我们想用索引10来计算元素,我们已经有了...8,9的值。这是在某种程度上优化了,还是对于下一个元素,我们会遍历所有的对?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 14:38:21

加上-

  1. LazyList本质上是一个LinkedList,这意味着要访问第10个元素,您必须首先遍历所有的内容。

  1. -- #::操作符/方法最终创建了一个新的类,这是库代码-

隐式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)

  • Afterwards中懒洋洋地包装着的
  1. 我们有cons操作符#::,我们附加了一个新的head #::,我们又给LinkedList BigInt(0)附加了一个新的头,现在我们的递归结构已经准备好了。

当我们呼唤头,我们开始展开包装,然后懒惰开始采取行动。

此外,LazyList内部使用这种状态结构来建模头和尾

代码语言:javascript
复制
private sealed trait State[+A] extends Serializable {
  def head: A
  def tail: LazyList[A]
}

这个结构是它对每个元素的第一次访问的回忆录。

代码语言:javascript
复制
private lazy val state: State[A] = { ... }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63829674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档