Je suis curieux de connaître les performances d'exécution d'une liste infinie comme celui ci-dessous:
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Cela va créer une liste infinie de la suite de fibonacci.
Ma question est que si je ne les suivants:
takeWhile (<5) fibs
combien de fois n' fibs
évaluer chaque terme de la liste? Il semble
que depuis takeWhile
vérifie la fonction de prédicat pour chaque élément dans
la liste, l' fibs
liste permettra d'évaluer chaque terme à de multiples reprises. L'
les 2 premiers termes sont donnés gratuitement. Lors de l' takeWhile
veut évaluer
(<5)
sur le 3ème élément, nous aurons:
1 : 1 : zipWith (+) [(1, 1), (1)] => 1 : 1 : 3
Maintenant, une fois takeWhile
veut évaluer (<5)
sur le 4ème élément: l'
nature récursive de l' fibs
permettra de construire la liste, à nouveau, comme la
suivantes:
1 : 1 : zipWith (+) [(1, 2), (2, 3)] => 1 : 1 : 3 : 5
Il semblerait que le 3ème élément doit être calculé à nouveau lorsque nous
voulez évaluer la valeur de la 4ème élément. En outre, si l'
prédicat en takeWhile
est grand, il peut indiquer que la fonction est
faire plus de travail est nécessaire, car il est de l'évaluation de chaque précédant
élément dans la liste plusieurs fois. Mon analyse est ici correct ou est
Haskell faire quelques mise en cache pour éviter que plusieurs évaluations ici?