下編譯發生了什麼,但訪問fs
生成因爲定義遞歸性質,所以StackOverflowError
。
lazy val fs:List[Product] = List(2,3,4).zip(fs.tail)
如果我們想更具體的瞭解,我們可以做一些喜歡的類型:
lazy val fs:List[(Int, (Int, Product))] = List(2,3,4).zip(fs.tail)
的typle不Nothing
。由於以下不會編譯:發生
scala> lazy val fs:Nothing = List(2,3,4).zip(fs.tail)
<console>:8: error: value tail is not a member of Nothing
lazy val fs:Nothing = List(2,3,4).zip(fs.tail)
類似類型的錯誤,如果我們定義爲FS List[Nothing]
,List[(Int, Nothing)]
等等等等,所以很明顯的表達的類型是Product
一個List
。現在,如果我們使用Stream
,而不是我們可以做出的東西,不會導致運行時錯誤:
scala> lazy val fs:Stream[Any] = 0 #:: 1 #:: fs.zip(fs.tail).map(p => p:Any)
fs: Stream[Any] = <lazy>
scala> fs take 5 foreach println
0
1
(0,1)
(1,(0,1))
((0,1),(1,(0,1)))
@ZoltanHamori我不相信這是真的。看到我的答案。 – 2012-08-14 17:30:49
我同意你不能輸入它沒有,並意識到(我曾嘗試過,應該提到它)。我相信原因是Nothing雖然是任何類型的子類型,但沒有可以調用的成員(這使得它成爲一個相當特殊的子類型)。我的意思是輸入Nothing作爲永久循環(或溢出堆棧)的類型。我應該更精確。 – 2012-08-14 18:02:47
Yeah'Nothing'是特殊的,但是不能將結果輸入到Nothing的原因是編譯器需要一個List,而Nothing不是一個List,它沒有任何意思。 )去做'Nothing'的成員。 – 2012-08-14 18:43:52