scala – scanLeft的非严格视图
发布时间:2020-12-16 18:17:08 所属栏目:安全 来源:网络整理
导读:我遇到了一个问题. scanLeft与Iterator,Stream和视图的工作方式不同.我不确定这种差异来自哪里. 我们来看看这个例子: scala (1 to 4).iterator.scanLeft(0)((a,b) = { println(b) ; a + b}).take(2).toList12res1: List[Int] = List(0,1)scala (1 to 4).toS
我遇到了一个问题. scanLeft与Iterator,Stream和视图的工作方式不同.我不确定这种差异来自哪里.
我们来看看这个例子: scala> (1 to 4).iterator.scanLeft(0)((a,b) => { println(b) ; a + b}).take(2).toList 1 2 res1: List[Int] = List(0,1) scala> (1 to 4).toStream.scanLeft(0)((a,b) => { println(b) ; a + b}).take(2).toList 1 res2: List[Int] = List(0,1) scala> (1 to 4).view.scanLeft(0)((a,b) => { println(b) ; a + b}).take(2).toList 1 2 3 4 res4: List[Int] = List(0,1) 最奇怪的是观点.它的表现就像它不是懒惰的.但是,使用.map时,没关系. scala> (1 to 4).view.map{ b => println(b) ; b}.take(2).toList 1 2 res9: List[Int] = List(1,2) 有人可以告诉我原因吗? 解决方法
这是视图中的错误.有很多这样的错误.有关详情,请参见
https://issues.scala-lang.org/browse/SI-4332. (我对2013年1月4日的评论是我注意到你对scanLeft做了同样的事情.)
由于它们存在许多质量问题,我从不在自己的代码中使用视图,也不建议将其用于其他人. 正在努力用更好的东西取代观点;在此期间,我建议将它们视为已弃用,即使它们尚未正式弃用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |