使用流/无限列表的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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |