Les compiles suivants, mais l'accès fs
génère un StackOverflowError
en raison des définitions recursize nature.
lazy val fs:List[Product] = List(2,3,4).zip(fs.tail)
Si nous voulions être plus précis sur le type que nous pourrions faire quelque chose comme:
lazy val fs:List[(Int, (Int, Product))] = List(2,3,4).zip(fs.tail)
Le typle n'est pas Nothing
. Étant donné que le suivant ne compile pas:
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)
erreurs de type similaires se produisent si nous définissons fs comme List[Nothing]
, List[(Int, Nothing)]
etc etc Donc clairement le type de l'expression est un List
de Product
. Maintenant, si nous utilisons Stream
au contraire, nous pouvons faire quelque chose qui ne provoque pas une erreur d'exécution: Je ne pense pas
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 Je ne suis pas convaincu que ce soit vrai. Vois ma réponse. –
Je suis d'accord que vous ne pouvez pas le taper Rien, et était au courant de cela (j'avais essayé, aurait dû le mentionner).Je crois que la raison en est que tandis que Nothing est un sous-type de n'importe quel type, il n'y a aucun membre que vous pouvez appeler (ce qui en fait un sous-type plutôt spécial). Je voulais dire taper Nothing comme le type de quelque chose qui va boucler pour toujours (ou déborder la pile). J'aurais dû être plus précis. –
Ouais 'Nothing' est spécial, mais la raison pour laquelle il est impossible de taper le résultat' Nothing' est que le compilateur nécessite un 'List' et' Nothing' n'est pas un 'List' il n'a rien (sans jeu de mots;) faire ce que les membres de 'Nothing' sont. –