J'ai une fonction qui prend un paramètre et produit un résultat. Malheureusement, cela prend assez de temps pour que la fonction produise le résultat. La fonction est appelée assez souvent avec la même entrée, c'est pourquoi il serait pratique de mettre en cache les résultats. Quelque chose commeRésultats de la mise en cache Haskell d'une fonction
let cachedFunction = createCache slowFunction
in (cachedFunction 3.1) + (cachedFunction 4.2) + (cachedFunction 3.1)
Je regardais dans Data.Array et bien que le tableau est paresseux, je dois l'initialiser avec une liste de paires (en utilisant ListArray) - ce qui est peu pratique. Si la 'clé' est par exemple le type 'Double', je ne peux pas l'initialiser du tout, et même si je peux théoriquement affecter un entier à chaque entrée possible, j'ai plusieurs dizaines de milliers d'entrées possibles et je n'en utilise qu'une poignée. J'aurais besoin d'initialiser le tableau (ou, de préférence, une table de hachage, car seule une poignée de resutls sera utilisée) en utilisant une fonction au lieu d'une liste. Mise à jour: Je lis les articles sur les mémos et, pour autant que je le comprenne, le MemoTrie pourrait fonctionner comme je le souhaite. Peut être. Quelqu'un pourrait-il essayer de produire la fonction 'cachedFunction'? Préférablement pour une fonction lente qui prend 2 arguments Double? Ou, alternativement, cela prend un argument Int dans un domaine de ~ [0..1 milliard] qui ne mangerait pas toute la mémoire?
+1 pour memoization – Macke
Le domaine clé est d'environ 1,8 milliard. Je n'ai aucun moyen de _initialiser_ n'importe quelle structure de données car cela me ferait perdre toute la mémoire disponible. – ondra
C'est pourquoi l'idée est l'initialisation * paresseuse *; Théoriquement, la structure de données contient tout l'espace clé, mais une évaluation non stricte ne permet que l'initialisation des parties que vous utilisez réellement. C'est la même idée que les listes infinies, sauf que vous aurez besoin de quelque chose qui évite la traversée linéaire. –