加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用流/无限列表的Scalas(a,b).zipped(或Tuple2.zipped)概念

发布时间:2020-12-16 18:53:50 所属栏目:安全 来源:网络整理
导读:这里是我认为 scala中斐波那契的正确和有用的定义: lazy val fibs:Stream[Int] = 0 #:: 1 #:: (fibs,fibs.tail).zipped.map(_+_) 但是,我收到以下错误: fibs take 10 foreach println01java.lang.StackOverflowError at scala.collection.mutable.LazyBuil
这里是我认为 scala中斐波那契的正确和有用的定义:

lazy val fibs:Stream[Int] = 0 #:: 1 #:: (fibs,fibs.tail).zipped.map(_+_)

但是,我收到以下错误:

fibs take 10 foreach println
0
1
java.lang.StackOverflowError
    at scala.collection.mutable.LazyBuilder.(LazyBuilder.scala:25)
    at scala.collection.immutable.Stream$StreamBuilder.(Stream.scala:492)
    at scala.collection.immutable.Stream$.newBuilder(Stream.scala:483)
    at...

我猜zipped与流无法正常工作?关于如何使这项工作,或为什么这不(不应该?)工作的任何建议?

解决方法

以下工作正常

val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b }

Tuple2.zipped的问题在于它假设它可以在它正在压缩的序列上运行foreach.这可能是设计的,因为Stream.zip实现它的方式可能会给你的任何有限长度的Seq(不是List或Stream)带来不好的性能. (因为大多数数据结构不支持尾部的有效实现.)

Stream.zip本质上实现如下(虽然它做了一些东西,使类型更通用).

class Stream[A]{
  def zip(other:Stream[B]) =
    (this.head,other.head) #:: (this.tail zip other.tail)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读