J'ai vu cet extrait de Haskell en this answer par proud haskeller sur Meta PPCG: "attends, je peux le faire à Scala"Pourquoi une liste paresseuse récursive souffle-t-elle la pile dans Scala?
x=2:x
Je pensais que, J'ai donc essayé:
lazy val x: List[Int] = 2 :: x
Il a compilé et imprimé ma console une belle x: List[Int] = <lazy>
. Mais chacune de ces lignes se traduit par une StackOverflowException
:
x take 1
x.head
x(1)
x
Basé sur le dernier, il semble que toute tentative d'utiliser x
souffle la pile essayant de calculer x
(ça ou un débordement de pile se passe-t essayer d'imprimer dans la console). En quoi la paresse de Scala est-elle différente de la paresse d'Haskell dans cet exemple? Est-ce une caractéristique de lazy val
de Scala ou est-ce que la classe List
nécessite simplement une queue complète?
Pas tout à fait, vous avez besoin du type de retour pour compiler, mais toujours agréable. Avec vals paresseux, c'est paresseux val x: Stream [Int] = 2 # :: x'. –
@BrianMcCutchon, c'est vrai. Occupé composer le 2ème paragraphe et raté ça. Je dirais, cependant, qu'il est inutile de rendre le 'Stream' val paresseux. Si c'est un 'val' alors les résultats (éléments évalués) sont mémoized. Si c'est un 'var' ils ne le sont pas. Faire un «valse paresseux» ne vous achète pas beaucoup. – jwvh
Oups. Une autre faute de frappe essayant de clarifier la différence entre le flux 'val', qui est mémoized, et le flux' def' (pas 'var'), qui n'est pas mémoized. – jwvh