J'ai remarqué que, parfois, Haskell fonctions pures sont en quelque sorte mis en cache: si j'appelle la fonction deux fois avec les mêmes paramètres, la deuxième fois, le résultat est calculé en un rien de temps.
- Pourquoi est-ce arrivé? Est-il un GHCI fonction ou quoi?
- Puis-je compter sur cela (c'est à dire: puis-je de façon déterministe savoir si une valeur de fonction sera mis en cache)?
- Puis-je la force ou de désactiver cette fonctionnalité pour certains appels de fonction?
Tel que requis par les commentaires, voici un exemple que j'ai trouvé sur le web:
isPrime a = isPrimeHelper a primes
isPrimeHelper a (p:ps)
| p*p > a = True
| a `mod` p == 0 = False
| otherwise = isPrimeHelper a ps
primes = 2 : filter isPrime [3,5..]
Je m'attendais, avant de l'exécuter, pour être un peu plus lent, car il conserve l'accès aux éléments d' primes
sans explicitement la mise en cache d'eux (donc, à moins que ces valeurs sont mises en cache quelque part, ils doivent être recalculés à de nombreuses reprises). Mais j'avais tort.
Si j'ai mis en +s
dans GHCI (pour imprimer calendrier/mémoire stats après chaque évaluation) et d'évaluer l'expression primes!!10000
deux fois, c'est ce que j'obtiens:
*Main> :set +s
*Main> primes!!10000
104743
(2.10 secs, 169800904 bytes)
*Main> primes!!10000
104743
(0.00 secs, 0 bytes)
Cela signifie qu'au moins primes !! 10000
"(ou mieux: l'ensemble de l' primes
la liste, depuis aussi primes!!9999
prendra pas le temps) doit être mis en cache.