2015-09-08 37 views
4

我遇到了問題。 scanLeft與Iterator,Stream和視圖不同。我不確定這種差異來自哪裏。 讓我們來看看下面這個例子:scanLeft的非嚴格視圖

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) 

有人能告訴我原因嗎? 在此先感謝

回答

4

這是一個視圖中的錯誤。有很多這樣的錯誤。詳情請參閱https://issues.scala-lang.org/browse/SI-4332。 (我的04 /月/ 2013註釋我注意到你沒有關於scanLeft同樣的事情。)

因爲他們的許多質量問題,我從來沒有在我自己的代碼中使用的觀點,我不建議他們到其他人,無論是。

目前正在努力用更好的東西替代觀點;見https://github.com/scala/slip/pull/17。與此同時,我建議將它們視爲已棄用,儘管它們尚未正式棄用。