我遇到了一个问题. 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做了同样的事情.)
由于它们存在许多质量问题,我从不在自己的代码中使用视图,也不建议将其用于其他人.
正在努力用更好的东西取代观点;在此期间,我建议将它们视为已弃用,即使它们尚未正式弃用.